Go语言编程入门超级指南

2020-01-28 12:01:04王冬梅

    "errors"
    "os"
)

/**
 * 自定义Error类型,实现内建Error接口
 * type Error interface {
 *      Error() string
 * }
 */
type MyError struct {
    arg int
    msg string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.msg)
}

/**
 * Failed[*errors.errorString]: Bad Arguments - negative!
 * Success:  16
 * Failed[*main.MyError]: 1000 - Bad Arguments - too large!
 *
 * Recovered! Panic message[Cannot find specific file]
 * 4 3 2 1 0
 */
func main() {
    // 1.Test error
    args := []int{-1, 4, 1000}
    for _, i := range args {
        if r, e := testError(i); e != nil {
            fmt.Printf("Failed[%T]: %vn", e, e)
        } else {
            fmt.Println("Success: ", r)
        }
    }

    // 2.Test defer
    src, err := os.Open("control.go")
    if (err != nil) {
        fmt.Printf("打开文件错误[%v]n", err)
        return
    }
    defer src.Close()
    // use src...

    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }

    // 3.Test panic/recover
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Recovered! Panic message[%s]n", r)
        }
    }()

    _, err2 := os.Open("test.go")
    if (err2 != nil) {
        panic("Cannot find specific file")
    }
}

func testError(arg int) (int, error) {
    if arg < 0 {
        return -1, errors.New("Bad Arguments - negative!")
    } else if arg > 256 {
        return -1, &MyError{ arg, "Bad Arguments - too large!" }
    } else {
        return arg * arg, nil
    }
}

4.高级特性

上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号、函数多返回值、switch-case默认break、函数闭包、集合切片等特性相比Java的确提高了开发效率,但这些在其他语言中也都有,并不是Golang能真正吸引人的地方。不仅是Golang,我们学习任何语言当然都是从基本语法特性着手,但学习时要不断地问自己:使这门语言区别于其他语言的”独到之处“在哪?这种独到之处往往反映了语言的设计思想、出发点、要解决的”痛点“,这才是一门语言或任何技术的立足之本。