当前位置:网站首页>Go-12-结构体
Go-12-结构体
2022-08-09 01:26:00 【hahyyy】
结构体
Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合
结构体表示一项记录,类似于其他语言中的class,可以在结构体中定义多个字段,为结构体实现方法、实例化等
定义结构体
结构体定义需要使用 type 和 struct 语句
struct 语句定义一个新的数据类型,结构体中有一个或多个成员
type 语句设定了结构体的名称
定义一个结构体Student,并为Student添加name,age字段
type Student struct {
name string
age int
}
为结构体添加方法
Go不像其他面向对象语言一样,可以写class然后在class里面写方法,但也很巧妙实现了这种效果
我们只需要在普通函数前面加个接收者,这样编译器就知道这个函数属于哪个struct了
语法格式:func (r ReceiverType) funcName(parameters) (results)
示例:为Student实现hello方法
func (stu *Student) hello(person string) string {
return fmt.Sprintf("hello %s, I am %s", person, stu.name)
}
形象一点说,ReceiverType类型的所有字段,方法funcName都是可以使用的,可以认为funcName属于ReceiverType
实现方法与实现函数的区别在于,func和函数名hello之间,加上该方法对于的实例名stu及其类型*Student,可以通过实例名访问该实例的字段name和其他方法了
method特性
- Go中虽没有class,但依旧有method
- 通过显示说明receiver来实现与某个类型的组合
- 只能为同一个包中的类型定义方法
- Receiver可以是类型的值或者指针
- 不存在方法重载
- 可以使用值或指针来调用方法,编译器会自动完成转换
- 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数
- 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
- 类型别名不会拥有底层类型所附带的方法
- 方法可以调用结构中的非公开字段
使用结构体
结构体可以包含多种数据类型,数组只能是单一类型的数据集合
// 创建一个实例
stu := &Student{
name: "Tom",
}
// 调用实例方法
msg := stu.hello("Jack")
fmt.Println(msg) // hello Jack, I am Tom
// 使用New实例化
stu2 := new(Student)
stu2.name = "Cali"
// hello Alice, I am , name 被赋予默认值""
fmt.Println(stu2.hello("Alice"))
struct特性
- Go中的struct与C中的struct非常相似,并且Go没有class
- 使用type <name> struct{}定义结构,名称遵循可见性规则
- 支持指向自身的指针类型成员
- 支持匿名结构,可用作成员或定义成员变量
- 匿名结构也可以用于map的值
- 可以使用字面值对结构进行初始化
- 允许直接通过指针来读写结构成员
- 相同类似的成员可进行直接拷贝赋值
- 支持 == 和 != 比较运算符,但不支持 > 或 <
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
- 嵌入结构作为匿名字段看起来像继承,但不是继承
- 可以使用匿名字段指针
匿名结构
匿名结构,没有名称的结构体
func main() {
// 匿名结构,没有名称的结构体
a := struct {
Name string
Age int
}{
Name:"Corwien",
Age: 20,
}
fmt.Println(a)
}
匿名结构嵌套
type person struct{
Name string
Age int
Contact struct {
Phone, City string
Code int // 门牌号
}
}
func main() {
a := person{Name:"Corwien", Age:15}
a.Contact.Phone = "10086"
a.Contact.City = "Guangzhou"
a.Contact.Code = 2007
fmt.Println(a)
}
匿名字段
匿名字段:结构体没有命名结构体属性的字段,只有类型
匿名字段必须严格遵守字段类型声明的顺序
type person struct{
string
int
}
func main() {
// 匿名字段必须严格遵守字段类型声明的顺序
a := person{"Corwien", 12}
fmt.Println(a)
}
结构类型比较
type person struct{
Name string
Age int
}
func main() {
// 匿名字段必须严格遵守字段类型声明的顺序
a := person{Name:"Corwien", Age:12}
b := person{Name:"Corwien", Age:12}
fmt.Println(a == b)
}
边栏推荐
猜你喜欢
5-5 Seaborn库FacetGrid结构图
makefile file compilation
网络安全基础-基本dos命令(一)
企业里Foxmail邮箱问题解决方法汇总
5-1 Seaborn 关系绘图
全文翻译:欧盟第29条数据保护工作组 数据保护官指南
Using MySQL in Ubuntu/Linux environment: Solve the problem of com.mysql.jdbc.PacketTooBigException: Packet for query is too large
makefile文件编译
Loadrunner结合Fiddler实现脚本的录制
33. 分别谈谈联合索引生效和失效的条件
随机推荐
Bugs encountered in remote control projects
tf.pad()--填充操作
js文件的处理
A double non-programmer interviewed Ant, Meituan, Ctrip and other big companies with offers to share the interview process
PostMan导入证书 添加证书
5-3 Seaborn 分布绘图
JSON basics, transfer JSON data, and introduce four mainstream frameworks, jackson, gson, fastjson, and json-lib!
4-3 Matplotlib库 条形图
在特征通道提升网络性能 --SENet网络详解
5-4 Seaborn 线性回归绘图
远程控制项目遇到的bug
DataNode重启
RS&FSW测试脚本
4-7 Matplotlib库 箱线图
Region Proposal Network(RPN)
生成一系列随机字符串的文件
有相同字符串的查找
OpenSceneGraph3.5.1编译
轻量级网络ESPNet系列 空洞卷积简介
解决有路由策略的情况下域内NAT不通的问题