账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Go - 方法接收者类型为 T 与 *T的区别
    23
    0
    自定义类型方法如下
    type cInt []int
    
    func (c cInt) appendV(v int) {
            c = append(c,v)
    }
    
    func (c *cInt) appendP(v int)  {
            *c = append(*c,v)
    }
    测试使用数据
      c := cInt{2,3}
      c.appendV(4)
      c.appendV(5)
      c.appendV(6)
      fmt.Printf("after appendV :%v \n",c)
    
      c.appendP(9)
      c.appendP(10)
      c.appendP(11)
      fmt.Printf("after appendP :%v \n",c)
    
    测试结果如下
    -----------------------------
    after appendV :[2 3] 
    after appendP :[2 3 9 10 11] 
    

    自己理解的产生原因:

    把实参传递给 类型T : 相当于把Slice指向的底层数组的首地址传给虚参
    所以在方法内执行c = append(c, v)的时候 分配新的空间,复制c的内容到这个空间中,再添加v,最会把这个新的slice 地址赋值给 c, 而c是局部的变量,出了这个函数之后要被回收,随机这个新的slice 也就被回收,所以append的时候不能添加.

    把实参传递给 类型*T : 相当于把指向Slice的变量的地址传给虚参
    所以在方法内执行c = append(c, v)的时候 分配新的空间,复制c的内容到这个空间中,再添加v,最会把这个新的slice 地址赋值给 c, 相当于把外部变量的指向这个新的Slice

    另一个和Slice,Array 相关的内容
    type cInt []int
    
    func (c cInt) zeroValue() {
            for i := range c {
                    c[i] = 0
            }
    }
    
    func main() {
            fmt.Printf("-------------------\n")
            v := cInt{1,2,3,4,5,6}
            fmt.Printf("v:%v \n",v)
            v.zeroValue()
            fmt.Printf("v:%v \n",v)
            fmt.Printf("-------------------\n")
    }
    结果为:
    -------------------
    v:[1 2 3 4 5 6] 
    v:[0 0 0 0 0 0] 
    -------------------
    Other
    1. 上面仅仅是自己的理解,可能存在偏差或者理解错误,望请指正.
    2. 如果你有发现有更多的坑 可以在下面给出,相互学习,感谢在先.
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • Bemisfits 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部