interface的变量赋值时,需要检查右侧对象是否实现interface的方法集,若实现,则赋值Ok,否则不能被赋值。

常见问题

type tester interface {
   test()
   string() string
}

type data struct {}

func (d *data) test()  {}
func (d data) string() string {
   return ""
}

赋值:

func main() {
   var d data

   //错误
   //data实现的方法:string()
   var t tester = d

   //正确
   //*data实现的方法:string()和test()
   t = &d    //ok
   
   t.test()
}

典型应用

在类型的方法定义时,一般场景下都会定义为指针方法:

func (d *data) test()  {}

所以在对interface变量赋值时,一般使用指针赋值:

var d data
var t tester = &d

a朋
63 声望39 粉丝