教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 深入学习Go结构体struct/interface

深入学习Go结构体struct/interface

发布时间:2021-05-25   编辑:jiaochengji.com
教程集为您提供深入学习Go结构体struct/interface等资源,欢迎您收藏本站,我们将为您提供最新的深入学习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的反射机制

[关闭]
~ ~