zhcn 编程语言 Golang Golang 流程控制 非公開: Go语言中的类型嵌入和结构嵌入

Go语言中的类型嵌入和结构嵌入

结构可以包含一个或多个匿名(或嵌入)字段。也就是说,这些字段没有明确的名称,只需要字段的类型,并且该类型也是字段的名称。匿名字段本身可以是结构类型。也就是说,结构体可以包含嵌入的结构体。

这可以与面向对象语言中的继承概念进行松散的比较。稍后我们将看到它用于模拟类似继承的行为。 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 

一个结构只能包含一个相同类型的成员,因此您不必担心重命名该结构或错误分配它。当编译器检测到可能的赋值二义性时,它会报告错误。

《Go语言中的类型嵌入和结构嵌入》浅显易懂的讲解!您必须观看的最佳 2 个视频

GO言語でAPI開発「 gRPC 」入門
https://www.youtube.com/watch?v=vliAVKYELy8&pp=ygU2IEdv6KiA6Kqe44Gu5Z6L5Z-L44KB6L6844G_44Go5qeL6YCg5Z-L44KB6L6844G_JmhsPUpB
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
https://www.youtube.com/watch?v=kPXfMFJ0oIE&pp=ygU2IEdv6KiA6Kqe44Gu5Z6L5Z-L44KB6L6844G_44Go5qeL6YCg5Z-L44KB6L6844G_JmhsPUpB
结构可以包含一个或多个匿名(或嵌入)字段。也就是说,这些字段没有明确的名称,只需要字段的类型,并且该类型也是字段的名称。匿名字段本身可以是结构类型。也就是说,结构体可以包含嵌入的结构体。

这可以与面向对象语言中的继承概念进行松散的比较。稍后我们将看到它用于模拟类似继承的行为。 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 

一个结构只能包含一个相同类型的成员,因此您不必担心重命名该结构或错误分配它。当编译器检测到可能的赋值二义性时,它会报告错误。

《Go语言中的类型嵌入和结构嵌入》浅显易懂的讲解!您必须观看的最佳 2 个视频

GO言語でAPI開発「 gRPC 」入門
https://www.youtube.com/watch?v=vliAVKYELy8&pp=ygU2IEdv6KiA6Kqe44Gu5Z6L5Z-L44KB6L6844G_44Go5qeL6YCg5Z-L44KB6L6844G_JmhsPUpB
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
https://www.youtube.com/watch?v=kPXfMFJ0oIE&pp=ygU2IEdv6KiA6Kqe44Gu5Z6L5Z-L44KB6L6844G_44Go5qeL6YCg5Z-L44KB6L6844G_JmhsPUpB