分享
  1. 首页
  2. 文章

golang接口赋值操练

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

golang接口

接口,姑且就称之为定义了一系列(也可能是空的)方法,但是又没有实现这些方法的一种结构体。
有时候,在纠结,接口类型的变量,到底是什么类型了?带着这个问题,来实操一下。
首先定义两个个接口:

type YourType interface {
 SayHi(str string)
}
type HeType interface {
 SayHi(str string)
 SayBye(str string)
}

上边是两个接口,YourYype接口中定义了一个SayHi方法。HeType定义了SayHi方法与SayBye方法。
下边再来定义一个类实现YourType接口。

type youknow struct {
}
func (t youknow) SayHi(str string) {
 fmt.Println("hi " + str)
}

上边的youknow就实现了YourType方法。
接着再来定义一个类,实现HeType接口,HeType接口中的SayHi方法与YourType接口中的SayHi方法一样,也就是说youknow实现了HeType接口的SayHi方法,但是没有实现SayBye方法,那么接下来用过匿名组合的方式,实现SayBye接口,代码如下:


type dknow struct {
 youknow
}
func (t *dknow) SayBye(str string) {
 fmt.Println("bye bye " + str + ".see you tomorrow.")
}

通过匿名组合,上边的dknow就实现了HeType接口,匿名组合,是不是很好用,赞一个。

下边来通过代码演示结果。

func main() {
 var myouknow YourType = youknow{}
 myouknow.SayHi("demo")
 var mdknow HeType = new(dknow)
 mdknow.SayBye("demo")
}

上边先定义了一个接口类型的变量myouknow,赋值时,使用的youknow的结构体类型
在定义HeType接口类型的变量mdknow时,采用的是指针类型的dknow
为什么会出现两种不同的情况了,也就是说接口既可以是struct,又可以是Ptr,那么怎么去判断,什么时候该给struct类型,什么时候又改给Ptr类型了。
原则:
1. 看实现接口的类,在实现接口方法时,指向的是指针,还是非指针。youknow类在实现接口YourType时,他的方法SayHi是指向非指针的(专业术语不太会,姑且就这么描述了,不标准的地方请谅解,词可达意,无碍传播知识的要求写的文章,下同)。所以将youknow类实例化赋值给接口时,需要采用struct类型。
2. dknow类在实现HeType接口时,将SayBye方法指向了指针类型,所以在实例化dknow类赋值给接口时,需要使用Ptr类型赋值给接口变量。
3. dknow组合的youknow实现了SayHi方法,指向了Struct类型,自己实现的SayBye,又指向了Ptr,这种情况怎么算?答案是,SayHi指向的非指针对象,golang会自动生成一个指向指针的SayHi方法,那么dknow不就有指向指针的SayHi域SayBye两个方法了嘛,所以dknow就实现了HeType接口了。
4. 那将dknow类中的SayBye方法不指向指针,将youknow类中的SayHi指向指针,还能这样赋值吗?答案是,YourType接口类型的变量需要用Ptr赋值,HeType接口类型的变量,也需要用Ptr赋值。也就是说指向Struct的方法,会自动生成指向Ptr的方法,反之,不会。

package main
import "fmt"
type YourType interface {
 SayHi(str string)
}
type HeType interface {
 SayHi(str string)
 SayBye(str string)
}
type youknow struct {
}
type dknow struct {
 youknow
}
func (t youknow) SayHi(str string) {
 fmt.Println("hi " + str)
}
func (t *dknow) SayBye(str string) {
 fmt.Println("bye bye " + str + ".see you tomorrow.")
}
func main() {
 var myouknow YourType = youknow{}
 myouknow.SayHi("demo")
 var mdknow HeType = new(dknow)
 mdknow.SayBye("demo")
 mdknow.SayHi("he type")
}

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

本文来自:CSDN博客

感谢作者:hzwy23

查看原文:golang接口赋值操练

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏