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 语言中是否有这种语法呢?我们下次再见!

相关文章
|
6天前
|
XML JSON Go
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
|
6天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
6天前
|
关系型数据库 MySQL Go
工厂模式+自动注册管理Go多包结构体
工厂模式+自动注册管理Go多包结构体
51 1
|
7月前
|
Go
Go语言初始化指南:结构体成员变量的正确方式
Go语言初始化指南:结构体成员变量的正确方式
97 0
|
7月前
|
存储 Go
终于有人把Go语言结构体实例化讲透了!
终于有人把Go语言结构体实例化讲透了!
60 0
|
6天前
|
存储 Go 开发者
【Go语言专栏】Go语言中的结构体与方法
【4月更文挑战第30天】Go语言中的结构体是聚合数据类型,用于自定义复杂类型。通过`type`和`struct`关键字定义结构体,包含多个不同类型的字段。结构体实例化后,使用点操作符访问字段。方法为结构体添加行为,定义时需指定接收者(值或指针)。方法调用同样使用点操作符。匿名结构体无需命名,嵌套结构体可构建复杂数据结构。选择值或指针接收者取决于是否需要修改结构体状态。理解并熟练运用结构体和方法是编写高效Go代码的关键。
|
6天前
|
Go 开发者
Golang深入浅出之-Go语言结构体(struct)入门:定义与使用
【4月更文挑战第22天】Go语言中的结构体是构建复杂数据类型的关键,允许组合多种字段。本文探讨了结构体定义、使用及常见问题。结构体定义如`type Person struct { Name string; Age int; Address Address }`。问题包括未初始化字段的默认值、比较含不可比较字段的结构体以及嵌入结构体字段重名。避免方法包括初始化结构体、自定义比较逻辑和使用明确字段选择器。结构体方法、指针接收者和匿名字段嵌入提供了灵活性。理解这些问题和解决策略能提升Go语言编程的效率和代码质量。
32 1
|
6天前
|
存储 JSON 缓存
Go语言学习9-结构体类型
【4月更文挑战第8天】本篇 Huazie 向大家介绍 Go语言的接口类型
301 8
Go语言学习9-结构体类型
|
6天前
|
编译器 Go
go语言第六章(结构体与方法)
go语言第六章(结构体与方法)
24 0
|
6天前
|
存储 JSON Go
妙啊,空结构体还能这么用?Go语言的结构体看这篇就够了
妙啊,空结构体还能这么用?Go语言的结构体看这篇就够了