funcmain() { x := 100 p := &x fmt.Printf("p 的类型为:%T, p 的地址为:%p\n", p, &p) // p 为 *int 类型,有自己的地址, fmt.Printf("p 的值为:%v, x 的地址为:%p\n", p, &x) // 变量 p 保存了 x 的内存地址 fmt.Printf("x 的值为:%v, p 的引用值为:%v\n", x, *p) // p 的引用为变量 x 的值 }
在结构体指针引用使用过程中, 由于 Go 语言底层做了优化, 对结构体属性的访问可直接使用指针变量进行, 如:
1 2 3 4 5 6 7 8 9 10
funcmain() { type Student struct { Name string age int } stu := Student{"tom", 20} p := &stu (*p).Name="jack"// 先使用指针进行引用后, 对引用对象属性进行修改, 但是看起来比较复杂 p.Name = "jack"// 与上述引用相同, Go 语言在底层做了优化, 看起来/写起来比较简单 }
for 循环
主要有两种形式
1 2 3 4 5 6 7 8 9
for i := 0; i < 10; i++ { // do something }
for index, value := range x { // do something // 其中, index 表示 x 的索引下标, value 为 x 对应索引下标的值 // 可使用 _ 对其中元素进行站位操作 }
Go 中没有 while, until 等关键字, 因此没有 while true 或 do...until 等形式, 我们可以使用 for + if 条件判断达到类似的效果. 如下:
1 2 3 4 5 6 7 8 9 10 11 12
// 一直循环 for { // do something }
// do...while 形式 for { // do something if expression { break } }
if-else 流程控制
if-else 控制比较简单, 一般形式如下
1 2 3 4 5 6 7
if expression { // do something } elseif { // do something } else { // do something }