// if else func if_else(x int) int { if x == 0 { return 5 }else{ return x } }
// switch case func switch_case(i int){ //无需break switch i{ case 0: fmt.Println("0") case 1: fmt.Println("1") default: fmt.Println("Default") } }
// for sum := 0 for { sum ++ if sum > 10 { break } }
for j := 0; j < 5; j++ { ftm.Println(j) }
// goto func myfunc(){ i := 0 HERE: fmt.Println(i) i++ if i < 10 { goto HERE } }
函数
shell
1 2
import "mymath" //假设Add被放在一个叫mymath的包中 c := mymath.Add(1, 2)
小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。
shell
1 2 3 4 5 6 7 8 9 10 11 12
func myfunc(args ...int) { for _, arg := range args { fmt.Println(arg) } }
func myfunc(args ...int) { for _, arg := range args { fmt.Println(arg) } myfunc2(args...) }
任意类型的不定参数
shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14
func Printf(format string, args ...interface{}){ for _, arg := range args { switch arg.(type) { case int: fmt.Println(arg, "is an int value") case string: fmt.Println(arg, "is a string value") case int64: fmt.Println(arg, "is an int64 value") default: fmt.Println(arg, "is an unknown type") } } }
package main import( "fmt" ) func main(){ var j int = 5 a := func()(func()){ var i int = 10 return func() { fmt.Printf("i, j: %d, %d\n", i, j) } }() a() j *= 2 a() } // 结果 // i, j: 10, 5 // i, j: 10, 10
异常处理
shell
1 2 3
type error interface { Error() string }
大多数函数,如果要返回错误,可以定义如下模式。
shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
func Foo(param int)(n int, err error) { // ... }
n, err := Foo(0) if err != nil { // 错误处理 } else { // 使用返回值n }
type PathError struct { Op string Path string Err error } func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
type T struct{ A int B string } t := T{203, "mh203"} s := reflect.ValueOf(&t).Elem() typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ { f := s.Field(i) fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.Interface()) }
Go工具
包文档查看(网站形式)
plaintext
1 2
$ godoc -http=:8080 $ godoc -http=:8080 -path="."
包文档查看(命令行形式)
plaintext
1
$ go doc foo
代码格式化
plaintext
1 2
$ go fmt hello.go $ gofmt -l -w .
项目构建 go build:用于测试编译包,在项目目录下生成可执行文件(有main包);不能生成包文件 go install:主要用来生成库和工具。一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin);生成可执行文件在当前目录下, go install 生成可执行文件在bin目录下($GOPATH/bin)
plaintext
1 2
$ GOOS=linux GOARCH=amd64 go build calc $ go install calc
GOOS:系统,linux/darwin/windows GOARCH:386/amd64
单元测试
plaintext
1
$ go test calc
模块管理go mod
plaintext
1 2 3
$ go mod download # 下载指定模块 $ go mod init test.com/go #初始化当前模块 $ go mod vendor # 将依赖复制到当前vendor目录下