golang 接口赋值

hgqxjj · · 1209 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main
  
import (
"fmt"
)
  
type LesssAdder interface {
  Less(b Integer) bool
  Add(b Integer)
}
  
type Integer int
  
func (a Integer) Less(b Integer) bool {
  return a < b
}
  
func (a *Integer) Add(b Integer) {
  *a += b
}
  
func main() {
  
  var a Integer = 1
  var b LesssAdder = &a
  fmt.Println(b)
  
  //var c LesssAdder = a
  //Error:Integer does not implement LesssAdder 
  //(Add method has pointer receiver)
}

go语言可以根据下面的函数:

?

1
func (a Integer) Less(b Integer) bool

自动生成一个新的Less()方法

?

1
func (a *Integer) Less(b Integer) bool

这样,类型*Integer就既存在Less()方法,也存在Add()方法,满足LessAdder接口。 而根据

?

1
func (a *Integer) Add(b Integer)

这个函数无法生成以下成员方法:

?

1
2
3
func(a Integer) Add(b Integer) {
  (&a).Add(b)
}

因为(&a).Add()改变的只是函数参数a,对外部实际要操作的对象并无影响(值传递),这不符合用户的预期。所以Go语言不会自动为其生成该函数。因此类型Integer只存在Less()方法,缺少Add()方法,不满足LessAddr接口。(可以这样去理解:指针类型的对象函数是可读可写的,非指针类型的对象函数是只读的)将一个接口赋值给另外一个接口 在Go语言中,只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就等同的,可以相互赋值。 如果A接口的方法列表时接口B的方法列表的子集,那么接口B可以赋值给接口A,但是反过来是不行的,无法通过编译。



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:hgqxjj

查看原文:golang 接口赋值

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1209 次点击  
加入收藏 微博
上一篇:go gdb
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传