Go 语言类型的内嵌

在 Go 语言中的类型是可以直接内嵌到结构体中的,可以看作是一个没有属性名的属性。同时接口中也可以内嵌接口,并且只能内嵌接口。本文就来讲解以下 Go 语言如何使用内嵌类型。

 

1. 结构体内嵌类型

结构体中内嵌类型在开发中用的并不多,这只是一个延伸特性。意味着结构体在定义属性字段的时候可以只写类型,不写属性名,但是一个类型只能写一个,不然结构体会无法识别你调用的时候使用的是哪个字段,这种只写类型不写属性名的属性被称为匿名字段。

代码示例

代码块
  • package main
  • 2
  • import "fmt"
  • 4
  • type Student struct {
  • 6          Name string
  • 7          Age int
  • 8          int
  • }
  • 10
  • 11  func newStudent(name string, age int) Student {
  • 12        return Student{Name: name, Age: age, int: 10}
  • 13  }
  • 14  func main() {
  • 15         stu := newStudent("Codey", 18)
  • 16         fmt.Println("匿名字段的值:", stu.int)
  • 17  }
  • 第 8 行:结构体中内嵌了一个int类型;
  • 第 12 行:给匿名字段赋值的时候直接使用其字段类型即可;
  • 第 16 行:打印匿名字段的值。

执行结果:

图片描述

 

2. 结构体内嵌结构体

结构体内嵌结构体是用的最多的一种内嵌方式。它有点类似于面向对向语言中的继承,但是面向对象的设计原则中最好不要有多继承。甚至于 java 这个面向对象语言的老大哥,直接就是不允许多继承的。所以 Go 语言中的内嵌结构体更好理解为组合。

代码示例:

代码块
  • package main
  • 2
  • import "fmt"
  • 4
  • type Callable struct{}
  • 6
  • func (c Callable) Call() {
  • 8          fmt.Println("can call")
  • }
  • 10
  • 11  type Photographic struct{}
  • 12
  • 13  func (p Photographic) Photograph() {
  • 14        fmt.Println("can take photos")
  • 15  }
  • 16
  • 17  type Moblie struct {
  • 18        Callable
  • 19        Photographic
  • 20  }
  • 21
  • 22  type Pad struct {
  • 23        Photographic
  • 24  }
  • 25
  • 26  func main() {
  • 27        var m Moblie
  • 28        fmt.Println("Moblie Function:")
  • 29        m.Call()
  • 30        m.Photograph()
  • 31
  • 32        var p Pad
  • 33        fmt.Println("Pad Function:")
  • 34        p.Photograph()
  • 35  }
  • 第 5~15 行:定义了两个功能结构体:打电话和拍照;
  • 第 17~20 行:用打电话和拍照两个功能结构体,组合成为手机结构体;
  • 第 22~24 行:用拍照功能结构体,组合成为平板电脑结构体;
  • 第 26~34 行:初始化两个结构体,并打印它们的功能。

执行结果:

图片描述

 

3. 接口内嵌接口

接口内嵌接口也是一个非常实用的特性,可以使用这个功能来使同一个结构体,放在不同的接口中,而能使用的功能不同。常用的权限控制,对一个相同的数据结构,但是能操作的权限可以用接口分开。

代码示例

代码块
  • package main
  • 2
  • import "fmt"
  • 4
  • type Reader interface {
  • 6          Read()
  • }
  • 8
  • type Writer interface {
  • 10        Write()
  • 11  }
  • 12
  • 13  type OnlyReader interface {
  • 14        Reader
  • 15  }
  • 16
  • 17  type ReaderAndWriter interface {
  • 18        Reader
  • 19        Writer
  • 20  }
  • 21
  • 22  type file struct{}
  • 23
  • 24  func (f file) Read() {
  • 25        fmt.Println("Read something")
  • 26  }
  • 27
  • 28  func (f file) Write() {
  • 29        fmt.Println("Write something")
  • 30  }
  • 31
  • 32  func main() {
  • 33        f := file{}
  • 34        var rAndW ReaderAndWriter
  • 35        rAndW = f
  • 36        rAndW.Read()
  • 37        rAndW.Write()
  • 38
  • 39        var onlyR OnlyReader
  • 40        onlyR = f
  • 41        onlyR.Read()
  • 42  }
  • 第 13~15 行:内嵌一个读接口到只读接口中;
  • 第 17~20 行:内嵌读和写的接口到读写接口中;
  • 第 22~30 行:定义一个接口体实现读接口和写接口。

执行结果:

图片描述

 

4. 小结

本文介绍了结构体和接口的内嵌类型。其中结构体内嵌结构体和接口内嵌接口最为常用。需要注意的是接口只能内嵌接口,不可内嵌其它类型。

文章来源于网络,侵删!

相关新闻