深入学习Go结构体struct/interface
背景
在平常的工作中长看到一些Go程序员使用interface,但实际并不是很了解,趁着假期学习一波。了解其中的使用原理,也可以提高自己阅读代码的能力和提高编写效率。
参考:https://liujiacai.net/blog/2020/03/14/go-struct-interface/
参考:https://segmentfault.com/a/1190000018865258
参考:https://sanyuesha.com/2017/07/22/how-to-understand-go-interface/
interface的关键点
关键点1 interface 是一种类型
首先 interface 是一种类型,从它的定义可以看出来用了 type 关键字,更准确的说 interface 是一种具有一组方法的类型,这些方法定义了 interface 的行为。
go 允许不带任何方法的 interface ,这种类型的 interface 叫 empty interface。
关键点2 interface存储的是传入者的值
具体可看下方的代码
package main
import "fmt"
type carMove interface {
SetName()
GetName() string
}
type bwmCarStruct struct {
name string
}
func (car *bwmCarStruct) SetName() {
car.name = "别摸我"
}
func (car *bwmCarStruct) GetName() string {
return car.name
}
type bcCarStruct struct {
name string
}
func (car *bcCarStruct) SetName() {
car.name = "奔驰"
}
func (car *bcCarStruct) GetName() string {
return car.name
}
func allCarMov(i carMove){
i.SetName()
}
func main () {
bmwCar:=bwmCarStruct{}
fmt.Println(bmwCar)
allCarMov(&bmwCar)
fmt.Println(bmwCar)
bcCar:=bcCarStruct{}
fmt.Println(bcCar)
allCarMov(&bcCar)
fmt.Println(bcCar)
}
-----------------------------
output
{}
{别摸我}
{}
{奔驰}
关键点3 可以判断具体传入的结构体名称,并个性化修改
主要修改了allCarMov这个方法
func allCarMov(i carMove){
i.SetName()
if t, ok := i.(*bcCarStruct); ok {
fmt.Println("命中奔驰", t)
}
if t, ok := i.(*bwmCarStruct); ok {
fmt.Println("命中宝马", t)
}
}
------------------------
output
{}
命中宝马 &{别摸我}
{别摸我}
{}
命中奔驰 &{奔驰}
{奔驰}
到此这篇关于“深入学习Go结构体struct/interface”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
深入学习Go结构体struct/interface
真的理解go interface了吗?
golang 面试题(十三)interface内部结构和nil详解
Golang学习小结、从入门到精通资料汇总
golang 网络编程(10)文本处理
【Go语言入门系列】(八)Go语言是不是面向对象语言?
Go语言interface详解
基于类型系统的面向对象编程语言Go
Go语言与面向对象编程
活学活用golang的反射机制