这可以与面向对象语言中的继承概念进行松散的比较。稍后我们将看到它用于模拟类似继承的行为。 Go中的继承是通过嵌入或组合来实现的,因此组合比继承在Go中更常见。
考虑以下程序。
package main
import "fmt"
type innerS struct {
in1 int
in2 int
}
type outerS struct {
b int
c float32
int // 無名フィールド
innerS // 無名フィールド
}
func main() {
outer := new(outerS)
outer.b = 6
outer.c = 7.5
outer.int = 60
outer.in1 = 5
outer.in2 = 10
fmt.Printf("outer.b is: %d\n", outer.b)
fmt.Printf("outer.c is: %f\n", outer.c)
fmt.Printf("outer.int is: %d\n", outer.int)
fmt.Printf("outer.in1 is: %d\n", outer.in1)
fmt.Printf("outer.in2 is: %d\n", outer.in2)
// 構造体リテラルを使用する
outer2 := outerS{6, 7.5, 60, innerS{5, 10}}
fmt.Printf("outer2 is:", outer2)
} 执行结果如下。
outer.b is: 6
outer.c is: 7.500000
outer.int is: 60
outer.in1 is: 5
outer.in2 is: 10
outer2 is:{6 7.5 60 {5 10}}
由于匿名字段中存储的数据是通过outer.int类型的名称检索的,因此我们可以得出结论,结构中的每种数据类型只能有一个匿名字段。
嵌入式结构
同样,结构体也是数据类型,因此它们也可以用作匿名字段,如上例所示。外部结构体通过outer.in1直接访问内部结构体的字段,内部结构体也可以从其他包中获取。内部结构只需插入或内联到外部结构中。这种简单的“继承”机制提供了一种从另一种类型继承部分或全部实现的方法。
示例代码如下。
package main
import "fmt"
type A struct {
ax、ay int
}
type B struct {
A
bx、by float32
}
func main() {
b := B {A {1,2}, 3.0, 4.0}
fmt.Println(b.ax, b.ay, b.bx, b.by)
fmt.Println(b.A)
} 输出:
1 2 3 4
{1 2}
结构嵌入属性
Go语言的结构包括以下特点:
1)嵌入结构可以直接访问其成员变量。
嵌入式结构的成员可以通过外部结构的实例直接访问。如果一个结构体有多层嵌入结构体,当一个结构体实例访问任意层次的嵌入结构体成员时,该层结构体字段将作为传统结构体字段的最终字段传递,您可以只指定字段名称,而不是访问。它通过例如,访问ins.abc可以简化为ins.c。
2) 嵌入结构的字段名称是其类型名称
嵌入的结构字段仍然可以使用明细字段进行逐层访问。嵌入结构的字段名称是其类型名称。代码是:
var c Color
c.BasicColor.R = 1
c.BasicColor.G = 1
c.BasicColor.B = 0 一个结构只能包含一个相同类型的成员,因此您不必担心重命名该结构或错误分配它。当编译器检测到可能的赋值二义性时,它会报告错误。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

