• go 不可寻址的理解


    The concrete value stored in an interface is not addressable, in the same way that a map element is not addressable.
    意思具体值赋值给 interface 类型后与 map 中的元素一样是不可寻址的。

    map 由于可能触发扩容,元素不可寻址;

    package main
    
    const NewName = "run.wu"
    
    type Person interface {
    	getName() string
    	setName(name string)
    }
    
    type Male struct {
    	Name string
    }
    
    func (m Male) getName() string {
    	return m.Name
    }
    
    func (m *Male) setName(name string) {
    	m.Name = name
    }
    
    func main() {
    	var p1 Person = Male{} // error
    	p1.getName()
    	p1.setName(NewName)
    
    	var p2 Person = &Male{}
    	p2.getName()
    	p2.setName(NewName)
    }
    

    初始化 Male 的值对象赋值给 Person 接口,记作 p1,直接报错:

    cannot use Male literal (type Male) as type Person in assignment:
    Male does not implement Person (setName method has pointer receiver)
    错误内容是,Male 类型的变量不能赋值给 Person,因为 Male 类型没有实现 Person 接口(setName 是指针接收者方法)。

    那为什么之前的例子中,编译器可以自动将值类型(非接口类型)取地址做隐示转换,而这里就不可以了?原因就是开头那就话:

    The concrete value stored in an interface is not addressable.

    值类型赋值给接口,是不可寻址的,既然不可寻址,编译器也就没办法自动取其地址传给指针接收的方法了。

  • 相关阅读:
    省选测试28
    省选测试27
    省选测试26
    省选测试25
    省选测试24
    省选测试23
    省选测试22
    省选测试21
    关于maven 导入依赖的最终处理问题
    Dubbo 2 之抽取公共接口
  • 原文地址:https://www.cnblogs.com/fanzou/p/15955576.html
Copyright © 2020-2023  润新知