丫,和你的有点不一样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