变量是普通变量
var a string
a ="aa"
fmt.Println(&a) // 0xc000022070 (变量a的地址)
fmt.Printf("%p \n",&a) //0xc000022070
var b *string
b = &a
fmt.Printf("b de 地址------- %p \n",b) //0xc000022070
fmt.Printf("b de 值------- %v \n",b) //0xc000022070 (变量b存储的指针地址的值,即a的地址)
fmt.Printf("&b------- %p \n",&b) //0xc00004c028 (变量b的地址)
fmt.Printf("*b------- %v \n",*b) //aa
表格表示就是
0xc000022070(变量a的地址) | 10(变量a内存地址上存的值) |
0xc00004c028(变量b的地址) | 0xc000022070(变量b内存地址上存的值) |
变量是map等引用变量
var m1 map[int]int
fmt.Printf("申明结构体变量的地址------- %p \n",&m1) //0xc00004c020
fmt.Printf("此时结构未开辟内存空间------- %p \n",m1) //0x0(此时还未开辟内存空间给map,只是var声明时给变量一个内存地址)
m1 = make(map[int]int)
m1[0] = 0
m1[1] = 1
fmt.Printf("m1申请开辟内存的空间------- %p \n",m1) //0xc00001c0f0
fmt.Printf("m1变量的地址------- %p \n",&m1)//0xc00004c020
fmt.Printf("&m1[]------- %p \n",m1[0])// %!p(int=0)
表格表示就是
0xc00004c020(变量m1的地址) | 0xc00001c0f0 (给map开辟的内存地址) |
---|---|
如何对两个指针结构体赋值
func TestHutest(t *testing.T) {
s1 := StructA{name: "hutao", id: 1}
aa(&s1)
fmt.Printf("s1:%+v \n", s1)
}
func aa(s1 *StructA) {
s1 := &StructA{name: "hutest", id: 111111}
va = s1 //外层的s1值并未改变(两个地址互等没有意义)
*va = *s1 //外层s1值会改变
}