zoukankan      html  css  js  c++  java
  • go 成长路上的坑(1)

    一、先来看一段代码

    package main
    
    import "fmt"
    
    type X struct{}
    
    func (x *X) test(){
    	println("h1",x)
    }
    func main(){
    	a := X{} 
    	a.test()
    
    	(&X{}).test()
    
    	(X{}).test()
    }
    

    猜猜他的结果

    二、揭晓答案

    package main
    
    import "fmt"
    
    type X struct{}
    
    func (x *X) test(){
    	println("h1",x)
    }
    func main(){
    	a := X{} 
    	a.test()   // 正确
    
    	(&X{}).test()  // 正确 
    
    	(X{}).test()  // 报错 cannot call pointer method on X literal
    }
    

    三、为什么会是这样的

    • 声明赋值后调用指针方法
    a :=x
    a.test()  //正确
    
       指针方法可以调用的条件:
           receiver 必须是合法的指针(包括nil) 或者 能够获取实例的地址 
        a 是一个可以寻址的变量 ,所以可以调用test() 指针方法
    
        When the value is addressable, the language takes care of the common case of invoking a pointer method on a value by inserting the address operator automatically.
        翻译:
        当值是可被寻址的,go语言会处理通常的情况:
            在一个值上面调用它的指针方法,编译器会自动插入一个&取地址操作符
    
    • (&X{}).test() 正确
       指针方法可以调用的条件:
           receiver 必须是合法的指针(包括nil) 或者 能够获取实例的地址 
    
        (&X{})  是一个合法的指针
    
    • (X{}).test() 报错
        变量名 = 右值
        X{}  就是右值
        右值 是不可寻址的(unaddressable) ,所以会报错
    

    四、疑问

    (X{}).test()    不可寻址 报错了
    为什么
    (&X{}).test()   能取到地址了?
    
  • 相关阅读:
    Bytom资产发行与部署合约教程
    币币合约执行解析(包含部分源码)
    Bytom猜谜合约使用指南
    Bytom移动端钱包SDK开发基础
    Bytom矿池接入协议指南
    Bytom交易说明(UTXO用户自己管理模式)
    Derek解读Bytom源码-创世区块
    Derek解读Bytom源码-持久化存储LevelDB
    编写生成彩色验证码的Servlet
    最长公共子序列问题
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/10936481.html
Copyright © 2011-2022 走看看