Go by Example: Struct Embedding类型嵌入

Go语言支持在结构体中嵌入其他结构体或接口,这使得类型组合更加无缝。文中示例展示了如何创建含有嵌入结构体的容器类型,以及如何通过嵌入来间接实现接口。通过这种方法,可以直接在嵌入的类型上调用方法,也可以将包含嵌入接口的结构体赋值给实现了该接口的变量。
摘要由CSDN通过智能技术生成

英文源地址
Go支持嵌入结构体和接口, 以表达更无缝的类型组合. 不要与//go:embed混淆, 后者是在Go1.16+版本中引入的一个go指令,用于将文件和文件夹嵌入到应用程序二进制文件中的.

package main

import "fmt"

type base struct {
	num int
}

func (b base) describe() string {
	return fmt.Sprintf("base with num=%v", b.num)
}

// container中嵌入了base.一个结构嵌入看起来像是一个没有名字的字段
type container struct {
	base
	str string
}

func main() {
	// 当创建具有字面量的结构体时, 我们必须显式地初始化嵌入, 在这里, 嵌入类型用作字段名
	co := container{
		base: base{
			num: 1,
		},
		str: "some name",
	}
	// 我们可以直接在co上直接访问base地字段, 比如使用co.num
	fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str)

	// 或者, 我们可以使用嵌入的类型名称来拼写完整的路径
	fmt.Println("also num: ", co.base.num)

	// 由于container中嵌入了base, base的方法也就成为了container的方法.
	// 在这里, 我们直接通过co调用嵌入的base中的方法
	fmt.Println("describe:", co.describe())

	type describer interface {
		describe() string
	}

	// 用方法嵌入结构可以用来将接口实现赋予其他结构.
	// 这里我们看到container现在实现了describer接口, 因为它嵌入了base
	var d describer = co
	fmt.Println("describer:", d.describe())
}
$ go run struct-embedding.go
co={num: 1, str: some name}
also num: 1
describe: base with num=1
describer: base with num=1

下一节介绍: 泛型Generics.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值