go 结构体的思考

简介: go 结构体的思考

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDUtMTUtMTUxODM3LmpwZw.png

小熊工作做不完了,周末又要加班了, c++ 项目好不容易在不同的指令集编译出来,结果一跑就挂,连日志都没有,难受!


go 语言中的结构体


c++ 的结构体类似,如下定义一个结构体类型。

type Body struct {
  name string
  age  int
}

像这样就可以使用


var body Body
body.name = "coding3min"
body.age = 12
fmt.Println(body)


输出


{coding3min 12}


go 中的类


结构体在 go 中是最常用的一种语法,有没有想过为什么?


这是因为我们学过一些面向对象的语言,其中有一个叫类的概念,但是 go 里面没有。

go 用一种特殊的方式,把结构体本身看作一个类。


一个成熟的类,具备成员变量和成员函数,结构体本身就有成员变量,再给他绑定上成员函数,是不是就可以了!

type people struct {
  name string
}
func (p people) toString() {
  fmt.Println(p.name)
  fmt.Printf("p的地址 %p \n", &p)
}

上面给 people 结构体绑定了一个函数, 调用下看看

p1 := people{"coding3min"}
p1.toString()


按照 toString() 方法的内容,先输出 name 再输出 p的地址

coding3min
p的地址 0xc0001021f0  #这里的地址一会有用


再绑定一个函数,你想想和上面的函数有什么区别,注意 60% 的人第一眼都没看出来

func (p *people) sayHello() {
  fmt.Printf("Hello! %v \n", p.name)
  fmt.Printf("*p的地址 %p \n", p)
}


可以注意到,和 toString() 函数不同的是, sayHello() 用了指针的方式进行绑定。

输出,可以注意到这里的地址和上面的不同。

Hello! coding3min
*p的地址 0xc00008e1e0


这两种绑定方式,都是相当于给结构体绑定了函数,这个结构体等价于对象,唯一的不同点就是如果使用 * 绑定函数,那么这种对象就是单例的,引用的是同一个结构体。


p1 := people{"coding3min"}
p1.sayHello()
p2 := &people{"tom"}
p2.sayHello()

输出,可以看到地址一致。

*p的地址 0xc00008e220
p2的地址 0xc00008e220


一些拓展的结构体知识


声明时赋值


body2 := Body{
  "tom", 13,
}


结构体数组


bodys := []Body{
  Body{"jack", 12}, Body{"lynn", 18},
}


匿名结构体,一般用来存测试用例


class1 := struct {
  bodys []Body
}{
  []Body{Body{"jerry", 24}},
}


小结


通过这篇文章,你应该对 go 语言中的 对象 有一个直观的体验。


  1. 学会如何给结构体绑定方法
  2. 了解绑定方法时是否加 * 号(指针)的区别
  3. 学会声明时赋值、结构体数组、匿名结构体的知识


我们在 java 里学习过 interface (接口),通过接口定义一系列的函数(标准),实现接口的对象需要实现所有的方法,那 go 语言中是否有这种语法呢?我们下次再见!

相关文章
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
5月前
|
JSON Go C语言
Go语言之定义结构体(Struct)-《Go语言实战指南》
Go 语言中的结构体(`struct`)是一种复合数据类型,可将多个不同类型的字段组合成一个类型。本文介绍了结构体的基本定义、实例创建方式、字段访问与修改、零值特性、比较规则、嵌套使用及标签功能。通过示例代码详细讲解了如何定义和操作结构体,以及其在 JSON 编码等场景的应用。
|
10月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
310 71
|
11月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
238 1
Go nil 空结构体 空接口有什么区别?
|
11月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
131 3
Go to Learn Go之结构体
Go to Learn Go之结构体
97 5
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
282 0
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)

热门文章

最新文章