GO语言结构体
什么是结构体
结构体是用户定义的类型,表示若干个字段(Field)的集合。
结构体的声明
例如声明一个人, 有年龄age, 身高height, 体重weight, 可以将这三个属性组合在一起
type People struct { age int weight int height int }
上面的结构体People为结构体的名称, 称为命名的结构体, 我们也可以声明匿名结构体:
package main import ( "fmt" ) func main() { emp3 := struct { firstName, lastName string age, salary int }{ firstName: "Andreah", lastName: "Nikola", age: 31, salary: 5000, } fmt.Println("Employee 3", emp3) }
上面声明了一个匿名接口体, 并在声明的同时给匿名结构体赋值
结构体零值
当声明的结构体变量并没有被显式地初始化时,该结构体的字段将默认赋为零值。
结构体指针
如下, 创建一个结构体指针
package main import ( "fmt" ) type People struct { name string age, weight, height int } func main() { emp := &People{"andy", 48, 80, 175} fmt.Println("Name:", (*emp).name) fmt.Println("Age:", (*emp).age) }
emp是一个结构体指针变量, (*emp).name表示访问结构体emp的那么字段, GO语言允许结构体指针在访问字段时,使用emp.name 这也是GO语言的语法糖
匿名字段
GO语言允许结构体内有匿名字段,如
type Person struct { string int }
匿名字段的名称默认为它的类型, 比如上面Person结构体, 它有两个匿名字段, 但GO会默认这些字段名为他们的类型, 所以Person实际上有两个名为string和int的字段, 不过由于这个原因, 结构体内不能存在相同类型的匿名字段, 否则会报错
结构体作为函数参数
结构体作为函数参数有值参数和指针参数区别, 指针参数只可以接收结构体指针,同样值参数只能接收结构体值变量, 例如:
package main import ( "fmt" ) type person struct { age int name string } func print(r person) { fmt.Printf("name: %s, age : %d\n", r.name, r.age) } func main() { r := person{ name: "andy", age: 18, } print(r) p := &r /* ccannot use p (type *person) as type person in argument to print */ print(p) }
此代码编译会抛出错误:ccannot use p (type *person) as type person in argument to print
结构体作为方法的接收器
结构体作为方法的接收器, 分为指针接收器和值接收器, 两者可以混用, 这得益于GO语言的语法糖, 例如:
package main import ( "fmt" ) type person struct { age int name string } func (p person) print() { fmt.Printf("name: %s, age : %d\n", p.name, p.age) } func (p *person) printName() { fmt.Printf("name: %s\n", p.name) } func main() { r := person{ name: "andy", age: 18, } r.print() r.printName() p := &r p.print() p.printName() } //程序输出 name: andy, age : 18 name: andy name: andy, age : 18 name: andy
为了方便,GO语言把r.printName()解释为(&r).printName(), 把p.print()解释为(*p).print()
结构体实现接口
结构体实现接口, 分为指针接受者和值接受者, 使用值接受者声明的方法, 既可以用值来调用,也能用指针调用, 但是使用指针接受者声明的方法, 只能用指针调用
值接受者声明的方法不会影响接受者(因为是值传递), 所以GO语言在这里加了语法糖(默认将指针变量解释为普通值变量,因为反正不会影响接受者的值), 但是使用指针接受者声明的方法, 是会影响接受者的, 所以必须抛出错误, 以免用户在不知道的情况下,改变了接受者的值, 示例代码如下:
package main import "fmt" type Print interface { Print() } type Person struct { name string age int } func (p Person) Print() { // 使用值接受者实现 fmt.Printf("%s is %d years old\n", p.name, p.age) } type Address struct { state string country string } func (a *Address) Print() { // 使用指针接受者实现 fmt.Printf("State %s Country %s", a.state, a.country) } func main() { var d1 Print p1 := Person{"Sam", 25} d1 = p1 d1.Print() p2 := Person{"James", 32} d1 = &p2 d1.Print() var d2 Print a := Address{"Washington", "USA"} /* 如果下面一行取消注释会导致编译错误: cannot use a (type Address) as type Print in assignment: Address does not implement Print (Print method has pointer receiver) */ d2 = a //d2 = &a // 这是合法的 // 因为在第 22 行,Address 类型的指针实现了 Describer 接口 d2.Print() }
上面将d2 = a 注释调, 将d2 = &a打开即可正常运行
原文地址:https://www.cnblogs.com/y-yxh/p/12837826.html
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
- Android-Universal-Image-Loader 图片异步加载类库的使用
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
- haproxy反向代理环境部署(http和https代理)
- 网站速度优化模块HttpCompressionModule
- mysql启动后随即关闭问题解决(ibdata1文件损坏导致)
- webvirtmgr-重命名kvm虚拟机的名称
- Lucene 2.0最基本的入门代码
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- 查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
- 腾讯云平台部总经理陈磊:大数据背后的技术支撑
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- 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 数组属性和方法
- JavaScript 异步编程
- 日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
- Fastdfs高可用集群搭建
- Logstash:处理多个 input
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)
- PHP中的数据库连接持久化
- ClickHouse王炸功能即将来袭?
- 搭建Amoeba实现MySQL主从数据库读写分离
- 如何在centos7上看墙外的世界
- 远程仓库的使用
- 破解某交(y)友(p)app的VIP&&半自动im机器人
- 关于compareTo使用的几种情况
- 高通量数据中批次效应的鉴定和处理(二)