结构体变量不加的时候表示对象值,
变量的左边, 每加一个& 表示 加了一层洋葱皮
要剥开菜叶 就必须在左侧加 *, 直到看到对象本身数据
go与c 的指针结构示意具体是:
加 第一& 就变成引用,
再加第二个&就变成 引用的地址
再加&就变成 引用的地址的地址
以此类推
与语言c一样,包多少个& 就必须用同样数量的* 才能解开
go : (地址:结构体值) <- 引用型 <- 指针1地址 <- 指针2地址
go : (地址:普通变量) <- 指针 1地址 <- 指针2 地址 <- 指针3 地址
c: (地址:变量) <-指针 1地址 <- 指针2 地址 <- 指针3 地址
import "fmt"
type Tt1 struct {
ss string
}
func p1() Tt1 {
var t1 Tt1
t1 = Tt1{
"dfsg",
}
fmt.Println("1.1", t1, &t1)
t2 := t1
fmt.Println("1.2", t2, &t2)
// var t3 *Tt1
t3 := &t1
fmt.Println("1.3", t3, &t3, *t3)
t4 := t3
fmt.Println("1.4", t4, &t4, *t4)
t5 := &t3
fmt.Println("1.5", t5, &t5, *t5, **t5)
t7 := unsafe.Pointer(&t1)
fmt.Println("1.7", t7, &t7)
return t1
}
func p2() *Tt1 {
//var t1 *Tt1
t1 := &Tt1{
"dfsg",
}
fmt.Println("2.1", t1, &t1, *t1)
return t1
}
func p3() {
//普通变量
d1 := "sdfasf"
fmt.Println("3.1", d1, &d1)
d2 := 123
fmt.Println("3.2", d2, &d2)
// 非普通变量
d3 := [4]byte{1, 3, 4}
fmt.Println("3.3", d3, &d3)
d4 := []byte{1, 3, 4}
fmt.Println("3.4", d4, &d4)
}
func main() {
t1 := p1()
fmt.Println("1", t1, &t1)
t2 := p2()
fmt.Println("2", t2, &t2)
p3()
}
输出结果是
1.1 {dfsg} &{dfsg}
1.2 {dfsg} &{dfsg}
1.3 &{dfsg} 0xc000096558 {dfsg}
1.4 &{dfsg} 0xc000096560 {dfsg}
1.5 0xc000096558 0xc000096568 &{dfsg} {dfsg}
1.7 0xc0000a7020 0xc000096570
1 {dfsg} &{dfsg}
2.1 &{dfsg} 0xc000096580 {dfsg}
2 &{dfsg} 0xc000096578
3.1 sdfasf 0xc0000a7140
3.2 123 0xc000086480
3.3 [1 3 4 0] &[1 3 4 0]
3.4 [1 3 4] &[1 3 4]



