工作生活

golang中的struct

2019-07-02  本文已影响0人  XITEHIP

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。下面分两方面介绍:一个是基础部分,一个是看一下结构体在实际内存中的内存模型。

1 基础

1.1 定义

1.2 声明

1.3 初始化

1.4 new

1.5 特性

1.6 函数传参

1.7 结构体比较

1.8 匿名成员

1.9 嵌套

结构体可以嵌套另一个结构体。
结构体可以包含结构体类型的匿名成员,这样可以通过p.b就可以访问匿名成员结构体中的b。

1.10 标签

1.10.1 标签主要应用于json字符串与结构体成员的相互转换的映射关系,见下方代码实例:
type User struct {
    UserId   int    `json:"user_id"`
    UserName string `json:"user_name"`
}

u := &User{UserId: 1, UserName: "xitehip"}
j, _ := json.Marshal(u)
fmt.Println(string(j))
// 输出内容:{"user_id":1,"user_name":"tony"}
1.10.2 struct成员变量标签获取
t := reflect.TypeOf(u)
field := t.Elem().Field(0)
fmt.Println(field.Tag.Get("json"))

关于映射后续会有专门章节讲解。

2 内存布局

代码实例:

type Person struct {
    age int
    class int
    name string
}
var pp *Person
func main() {
    p := Person{age:18, class:8, name:"xitehip"}
    pp = &p
    fmt.Println(*pp)
}

编译生成的可执行文件,然后用gdb去分析内存布局见下图1


图1

由图1可以发现,结构体中的元素确实是连续排布的,只不过成员name存储的是指针。打印name指针的值发现确实是xitehip(可查看ascii表)这个字符串。

3 总结

结构体是一种存储复合数据,主要应用于一个实体有多个数据类型的场景。在golang面向对象思想中,结构体也应用非常广泛,在后续的文章会详细讲解golang中的面向对象。

参考go语言圣经

上一篇 下一篇

猜你喜欢

热点阅读