简单的说说golang的struct
这篇文章会讲什么
- 结构体的一些容易被忽略的零散知识点(但是在使用过程中不那么重要)
- 使用结构体的一点小小建议
思维导图
正文
语法糖
无论是定义的普通结构体变量变量,还是结构体指针都是通过点号(.
)访问成员变量.
比如
type Blogger struct {
Name string
Age int32
URL string
}
func main() {
b1 := Blogger{"zhangsan", 18, "zhangsan.com"}
b2 := *&Blogger{"lisi", 19, "lisi.org"}
fmt.Println(b2.Name, b1.Name)
}
b1
和b2
都通过点号访问到成员变量Name,而b2.Name
是等价于(*b2).Name
的.这是一种语法糖的结果,编译器对齐进行了优化.
顺序
在定义结构体的时候,相同类型的成员可以写在同一行,但是一般只在这两个成员紧密相关的时候这样做.
如上面的Blogger
可以写成下面的样子:
type Blogger struct {
Name, URL string
Age int32
}
两个在数据内容上是完全一样的,但是这两个结构体的意义却不同,因此定义成不同名的结构体.
可见性:
结构体的成员在包外的可见性取决于其名字的第一个字母是大写还是小写,如果是大写表示在包外可见,也就是可导出的(类似于其他语言中的public
),如果成员名第一个字母小写则表示在包外不可见,即不可导出的(类似于其他语言的private
)
自我包含:
一个结构体s可以包含数据类型为*s的成员变量,但是不可以包含数据类型为s的成员变量,即便通过嵌套的方式也不可以.
传递:
结构体可以当作参数和返回值传递
修改:
如果需要修改一个结构体一般通过传入结构体的指针,而不是直接返回一个结构体,或者只返回其需要的值.
匿名成员:
- 名字: 匿名成员的名字是其数据类型的名字(如果数据类型是string,那么这个匿名成员的名字就叫string)
- 访问: .+名字(数据类型)
- 同名: 同一个结构体中出现同名成员会冲突,无法通过编译:
ambiguous selector
.同名有两种情况:- 不同匿名成员类型相同(解决办法: 在定义的时候最多只能出现一个某一个类型的匿名成员)
- 嵌套的匿名结构体与结构体其他嵌套匿名成员结构体拥有同名的成员(解决办法: 在访问的时候不省略中间的匿名结构体)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用