【Golang之路】——结构体匿名字段

简介: 【Golang之路】——结构体匿名字段

引言


对于已经使用过一段时间golang语言的开发者来说,结构体一定不陌生,因为结构体在golang中还是使用非常频繁的,类似java中的class一样,对于结构体的一些非常基础的使用在这里就不再介绍了,本文主要介绍下最近在读别人代码的时候发现的一种写法,结构体中的匿名字段。


定义


结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。


匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。

Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐。

package main
import "fmt"
type innerS struct {
    in1 int
    in2 int
}
type outerS struct {
    b    int
    c    float32
    int  // anonymous field
    innerS //anonymous field
}
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 的名字来获取存储在匿名字段中的数据,于是可以得出一个结论:在一个结构体中对于每一种数据类型只能有一个匿名字段。


命名冲突


如果嵌入结构的字段和外部结构的字段相同,那么,想要修改嵌入结构的字段值需要加上外部结构中声明的嵌入结构名称。

type Info struct {
    sex int
    name string
    age int
    address string
}
type User struct{
    like string
    sex int
    Info
}
user:=User{}
user.sex=1//这里修改的外部结构User里面的sex字段值
user.Info.sex=2//这里修改的是嵌入结构Info的sex字段值


方法重写

package main
import "fmt"
type User struct {
    id   int
    name string
}
type Manager struct {
    User
    title string
}
func (self *User) ToString() string {
    return fmt.Sprintf("User: %p, %v", self, self)
}
func (self *Manager) ToString() string {
    return fmt.Sprintf("Manager: %p, %v", self, self)
}
func main() {
    m := Manager{User{1, "Tom"}, "Administrator"}
    fmt.Println(m.ToString())
    fmt.Println(m.User.ToString())
}

小结


通过上面的例子我们能够发现,通过这种组合结构的方式可以达到类似继承的功能,在我们日常开发过程中可以节省代码量,提高开发效率。

目录
相关文章
|
2月前
|
XML JSON Go
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
|
2月前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
2月前
|
存储 Go
Golang里空结构体struct{}的介绍和使用
【2月更文挑战第10天】Golang里空结构体struct{}的介绍和使用
47 6
|
2月前
|
关系型数据库 MySQL Go
工厂模式+自动注册管理Go多包结构体
工厂模式+自动注册管理Go多包结构体
90 1
|
12天前
|
Go
go结构体的定义
go结构体的定义
12 1
|
12天前
|
Go
go反射获取变量类型、值、结构体成员、结构体方法
go反射获取变量类型、值、结构体成员、结构体方法
14 0
|
16天前
|
Shell Go
怎么让 Go 中如何让结构体不可比较?
在 Go 语言中,结构体默认是可以比较的,只要它们的所有字段都是可比较的。如果结构体包含不可比较的字段(如 `map`),则该结构体不能直接使用 `==` 进行比较,会引发编译错误。可以通过 `reflect.DeepEqual()` 函数对包含不可比较字段的结构体进行深度比较。为了禁止结构体的相等性比较,可以使用 `_ [0]func()` 作为匿名字段,这是一种不占用额外内存且具有明确语义的优雅做法。Go 语言标准库中也有类似的应用。
|
2月前
|
存储 JSON 缓存
Go语言学习9-结构体类型
【4月更文挑战第8天】本篇 Huazie 向大家介绍 Go语言的接口类型
306 8
Go语言学习9-结构体类型
|
2月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
2月前
|
存储 Go Python
Go 语言结构体
Go 语言结构体
9 0