深入学习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
{}
命中宝马 &{别摸我}
{别摸我}
{}
命中奔驰 &{奔驰}
{奔驰}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值