golang的指针取值和赋值

demo作为一个自定义的类型
我取了他的内存地址,分两次对他的字段进行赋值,aaa和bbb.
但是当我最终打印demo时,似乎两次都没有影响到demo;
请问这是什么原理?

另外请问(*ccc).name这是个什么意思什么原理?
我翻了好几本书都没看到有详细的解释. 感谢

代码

    type demo struct {
        name string
        age  int
    }
    //取指针
    aaa := &demo{}
    aaa.name = "Mr.suck"
    aaa.age = 19
    logrus.Println(aaa)

        ///????
    ccc := &aaa
    (*ccc).name = "JackMa"

        logrus.Println(aaa)
        
    //打印原始demo struct
    logrus.Println(demo{})

    //去指针
    bbb := &demo{}
    bbb.name = "Ms.suck"
    bbb.age = 20
    logrus.Println(bbb)
    
    //打印原始demo struct
    logrus.Println(demo{})

执行结果

INFO[0000] &{Mr.suck 19}                                
INFO[0000] { 0}                                         
INFO[0000] &{Ms.suck 20}                                
INFO[0000] { 0}                                         
Exiting.
阅读 8.5k
1 个回答

丫,和你的有点不一样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 是获取ccc指针指向的结构体里面的name字段
golang 里面也有和 c 相同数据类型:指针
指针的值一般是一个变量的地址. 例如: var x int, 表达式 &x 就是获取一个指向整型变量的指针. 它的类型是整型指针(*int). 如果我们写成这样方式: p := &x; 我们就是说 p 指向x的地址. 表达式*p 就是 获取表达式的值.
重点:golang中的指针功能被弱化了,比如上面的 p := &x; 中不可以使用x++;也就是说golang中不能进行指针自增减操作,但在c中是可以的

最后一条内容的输出,如有不理解可参考下面关于指针转换的链接;

参考

golang中关于指针的一小部分内容

golang中关于指针的转换?

c 语言中的指针: 请biying或者参考一下 <<C和指针>> 这书

请教:在fmt.Printf写法中fmt.Printf("%v %p\n",aaa,aaa),我能不能只写一个aaa参数,让%v,%p都可以用尼? o(╥﹏╥)o

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏