Go 语言中的类型是可以直接内嵌到结构体中的,可以看作是一个没有属性名的属性。同时接口中也可以内嵌接口,并且只能内嵌接口。
结构体在定义属性字段的时候可以只写类型,不写属性名,但是一个类型只能写一个,不然结构体会无法识别你调用的时候使用的是哪个字段,这种只写类型不写属性名的属性被称为匿名字段。
package main
import "fmt"
type Student struct {
Name string
Age int
int
}
func newStudent(name string, age int) Student {
return Student{Name: name, Age: age, int: 10}
}
func main() {
stu := newStudent("Codey", 18)
fmt.Println("匿名字段的值:", stu.int)
}
匿名字段的值: 10
结构体内嵌结构体是用的最多的一种内嵌方式。它有点类似于面向对向语言中的继承,但是面向对象的设计原则中最好不要有多继承。Go 语言中的内嵌结构体更好理解为组合。
package main
import "fmt"
type Callable struct{}
func (c Callable) Call() {
fmt.Println("can call")
}
type Photographic struct{}
func (p Photographic) Photograph() {
fmt.Println("can take photos")
}
type Mobile struct {
Callable
Photographic
}
type Pad struct {
Photographic
}
func main() {
var m Mobile
fmt.Println("Moblie Function:")
m.Call()
m.Photograph()
var p Pad
fmt.Println("Pad Function:")
p.Photograph()
}
Moblie Function:
can call
can take photos
Pad Function:
can take photos
使用这个功能来使同一个结构体,放在不同的接口中,而能使用的功能不同。常用的权限控制,对一个相同的数据结构,但是能操作的权限可以用接口分开。
package main
import "fmt"
type Reader interface {
Read()
}
type Writer interface {
Write()
}
type OnlyReader interface {
Reader
}
type ReaderAndWriter interface {
Reader
Writer
}
type file struct{}
func (f file) Read() {
fmt.Println("Read something")
}
func (f file) Write() {
fmt.Println("Write something")
}
func main() {
f := file{}
var rAndW ReaderAndWriter
rAndW = f
rAndW.Read()
rAndW.Write()
var onlyR OnlyReader
onlyR = f
onlyR.Read()
}
Read something
Write something
Read something
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。