丫,和你的有点不一样A
输出使用fmt,没有使用logrus type demo struct {
name string
age int
}
aaa := &demo{}
aaa.name = "Mr.suck"
aaa.age = 19
fmt.Printf("%v,%p\n",aaa,aaa)
ccc := &aaa
(*ccc).name = "JackMa"
fmt.Printf("%v %p \n",aaa,aaa)
t := demo{}
fmt.Printf("%v %p \n",t,&t)
// 添加这行代码我觉得这个例子会更好
fmt.Printf("%v\n",aaa.name)
输出内容:
&{Mr.suck 19},0xc0000b61b0
&{JackMa 19} 0xc0000b61b0
{ 0} 0xc0000b61f8
JackMa%p 占位符是打印出地址
%v 占位符打印出默认值
我的理解:- aaa 和 ccc 都是指针,并且都指向同一个demo{}实例(打印地址都是: 0xc0000b61b0 嘛)
- t := demo{} 或者每次写demo{}都创建了一个新的demo实例和之前aaa指向的不是同一个实例(一个地址是:0xc0000b61b0;另一个是 0xc0000b61f8 )
其他
(*ccc).name 是获取ccc指针指向的结构体里面的name字段表达式*p 就是 获取表达式的值重点:golang中的指针功能被弱化了,比如上面的 p := &x; 中不可以使用x++;也就是说golang中不能进行指针自增减操作,但在c中是可以的 最后一条内容的输出,如有不理解可参考下面关于指针转换的链接;
参考
c 语言中的指针: 请biying或者参考一下 <<C和指针>> 这书
请教:在fmt.Printf写法中fmt.Printf("%v %p\n",aaa,aaa),我能不能只写一个aaa参数,让%v,%p都可以用尼? o(╥﹏╥)o