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()   能取到地址了?
    
  • 相关阅读:
    4.一对多关联映射
    3.一对一关联映射
    1.Hibernate框架
    19。数据库技术及分页
    18.文件的上传和下载
    17.JavaMail
    16.部署描述符文件
    15.Servlet程序结构与部署
    dba-查询sql耗时
    (72)C# 特性
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/10936481.html
Copyright © 2011-2022 走看看