Go 语言学习之 struct
01
概念
在 Go 语言中,struct 是将零个或多个任意类型的命名变量组合在一起的复合数据类型,struct 中的每个变量称为 struct 的成员变量。每个成员变量的字段名都是固定且唯一的,每个成员变量都会用一个内置类型或自定义类型来声明,并且支持使用自身的指针类型作为成员变量的类型,成员变量的字段名和排列顺序属于 struct 类型组成部分。
02
声明 struct 类型
声明一个 struct 类型以关键字 type 开头,接着是 struct 类型的名称,最后是关键字 struct,struct 的成员变量一般是一行写一个,成员变量的名称在类型的前面,并且连续的相同类型的成员变量可以写在一行,具有相同成员变量的 struct。
如果 struct 的成员变量名称是首字母大写,那么这个成员变量是可以跨包访问的,同一个 struct 可以包含可跨包和不可跨包访问的成员变量。
struct 类型分为匿名 struct 类型和命名 struct 类型,匿名 struct 类型是在每次需要它的时候定义 struct,需要做重复的工作,所以一般我们使用命名 struct 类型。
空结构(struct{})是指没有字段的 struct 类型。一般用作channel 的类型,用于事件通知,此处我们暂时不做过多介绍。
通过代码,我们演示如何声明 struct 类型。
type User struct {
ID int
Name string
age int
}
03
创建 struct 类型的变量
初始化 struct 类型的变量,可以按照成员变量的排列顺序初始化全部字段,也可以使用命名方式初始化指定成员变量,推荐使用命名方式初始化,原因是这样可以更加灵活的调整成员变量的顺序。通过代码,我们演示声明 struct 类型的变量。
- 使用关键字 var 创建。
type User struct {
ID int
Name string
age int
}
func main() {
var bob User
fmt.Println("bob = ", bob)
}
此种方式 struct 类型的初始值为各个成员变量的字段类型的零值。
- 使用 struct 字面量和短变量声明操作符创建
type User struct {
ID int
Name string
age int
}
func main() {
lucy := User{
ID: 1,
Name: "lucy",
age: 18,
}
fmt.Println("lucy = ", lucy)
}
- 不使用成员变量的字段名创建
type User struct {
ID int
Name string
age int
}
func main() {
lily := User{2, "lily", 17}
fmt.Println("lily = ", lily)
}
- 使用 struct 字面量和短变量声明操作符创建一个具有嵌入字段的 struct 类型的变量
type Admin struct {
person User
level string
}
type User struct {
ID int
Name string
age int
}
func main() {
joy := Admin{
person: User{
ID: 10001,
Name: "joy",
age: 28,
},
level: "senior",
}
fmt.Println("joy = ", joy)
}
struct 比较
struct 的所有成员变量都可以比较,struct 才可以比较。struct 的成员变量顺序不同,struct 之间的比较也不相等。
完整代码:
输出结果:
bob = {0 0}
lucy = {1 lucy 18}
lily = {2 lily 17}
joy = {{10001 joy 28} senior}
- linux学习第五十二篇: exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp服务
- linux学习第五十四篇:Tomcat介绍,安装jdk,安装Tomcat
- linux学习第五十九篇:LVS DR模式搭建,keepalived lvs
- linux学习第五十四篇:配置Tomcat监听80端口,配置Tomcat的虚拟主机,Tomcat日志
- linux学习第五十六篇:集群介绍,keepalived介绍,用keepalived配置高可用集群
- linux学习第五十八篇: 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS NAT模式搭建
- Python中eval带来的潜在风险,你知道吗?
- React Native自定义导航条
- android混淆那些坑
- 微信小程序开发入门篇
- Support Annotation Library使用详解
- React Native之Navigator
- React Native组件生命周期
- React Native使用原生组件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- HashMap都在用,原理你真的了解吗?
- Android必知必会--事件分发机制
- 又被逼着优化代码,这次我干掉了出入参 Log日志
- C#委托进阶,事件和委托,一次就看明白,附源码
- 树莓派爬虫多平台热搜榜轮播展示
- Scrapy 和 Pyppeteer 更优雅的对接方案
- 京喜前端自动化测试之路(小程序篇)
- JavaScript 混淆与逆向必读之 AST 节点类型名词基础
- 手把手教你如何实现大量图片的自适应图片页面的排列
- 那些你可能不知道的浏览器奇技淫巧
- 那些你可能不知道的 windows 奇技淫巧
- LeetCode-5.最长回文子串 中心扩散法
- 再谈备份微博
- Scala中的IO操作及ArrayBuffer线程安全问题
- 关于数字雨特效的学习