var a, b bool// var声明变量,必须在后面指定类型。而且会给一个默认值 var c, d int = 1, 2 e := 3// 不用var直接声明并赋值 const f = 4// 声明常量 _, err := function() // 表示第一个返回值后面不会被使用,这样可以防止出现"declared and not used"提示
reflect.TypeOf(b) // 获取变量类型
// 指针 var p *int// 定义p是一个指向int类型值的指针,默认值为nil p = &a // 取a的指针 *p // 取值
// 结构体 type Vertex struct { x int y int } v = Vertex{1, 2} v.x
由于有些函数确定了入参类型,但是接口又代表的是所有类型,所以如果要把一个接口传入一个明确类型的函数中,就需要特别指明其类型。例如function(var.(string)。不过这不能作用于接口数组,否则会出现invalid type assertion non-interface type []... on left这样的错误,如果要传入一个数组,需要我们构建一下参考:
1 2 3 4 5 6
s := make([]interface{}, len(t)) for i, v := range t { s[i] = v }
// json格式字符串转结构体使用tag来定义序列化时的字符串名称,例如 type Book struct{ Name string`json:"name" bson:"NAME"` } var book Book jsonStr := `{"Name": "haofly"}` json.Unmarshal([]byte(jsonStr), &book) fmt.Println(book)
// 继承/组合结构体 type Option2 struct { Option ip string }
// if语句 if x < 0 {} if x <0 && y > 0 {} if v := match.Pow(x, n); v < lim {} // 一边if一边声明变量,该变量只有在该作用域有效
// for 循环 for i := 0; i < 10; i++ {} for ; sum < 1000; {} // 可以直接不写前后条件 for sum < 1000 {} // while循环 for {} // while true循环 for i,v := range pow {} // pow是一个切片,for循环遍历切片时,每次迭代都会返回两个值,第一个是下标,第二个是元素
// switch,不需要在case后面加break switch os := os; os { case"darwin": ... default: ... } switch { case t.Hour() < 12: // 没错,可以这样写条件。反正都是从上往下,匹配到第一个就终止。其他语言为啥不这样 ... }
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`") var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
main(){ flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal("could not create CPU profile: ", err) } defer f.Close() if err := pprof.StartCPUProfile(f); err != nil { log.Fatal("could not start CPU profile: ", err) } defer pprof.StopCPUProfile() }
if *memprofile != "" { f, err := os.Create(*memprofile) if err != nil { log.Fatal("could not create memory profile: ", err) } defer f.Close() runtime.GC() // get up-to-date statistics if err := pprof.WriteHeapProfile(f); err != nil { log.Fatal("could not write memory profile: ", err) } // 这里是你原来的主程序 }
如果想要直接在web页面查看程序调用流程图或者火焰图,可以安装一个工具:go get -u github.com/google/pprof,然后pprof -http=:8080 cpu.prof即可在web端以多种形式查看样本数据。