GO语言基础之struct
结构struct
1. Go 中的struct与C中的struct非常相似,并且Go没有class
2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首字母大写对外可见)。 type person struct{}
3. 支持指向自身的指针类型成员,支持匿名结构,可用作成员或定义成员变量
4. 匿名结构也可以用于struct的值,可以使用字面值对结构进行初始化
5. 允许直接通过指针来读写结构成员
6. 相同类型的成员可进行直接拷贝赋值
7. 支持 == 与 != 比较运算符,但不支持 > 或 <
8. 支持匿名字段,本质上是定义了以某个类型名为名称的字段
9. 嵌入结构作为匿名字段看起来像继承,但不是继承
10. 可以使用匿名字段指针
一、结构体的基本使用案例

- package main
- import "fmt"
- /**
- 定义一个结构体,类似于其他语言的class
- */
- type person struct {
- Name string
- Age int
- }
- func main() {
- // struct 对属性操作使用符号 . ;这里赋值采用两种方式,既可以使用默认值,也可以在外部赋值
- a := person{
- Name : "liang",
- Age : 29,
- }
- //a.Age = 29
- fmt.Println("a修改前:", a)
- //第一次修改并打印
- modifyPerson(a)
- fmt.Println("a第一次修改后:", a)
- //第二次修改并打印
- modifyPersonPointer(&a)
- fmt.Println("a第二次修改后:", a)
- /**
- 假如有一种场景有很多需要修改person内容,那么每次传入都需要取地址符号,这样很麻烦,可以在赋值对时候直接取得对应对地址
- 这种方式是开发对推荐方式
- */
- b := &person{
- Name : "xuli",
- Age : 27,
- }
- fmt.Println("b修改前:", b)
- modifyPersonPointer(b)
- fmt.Println("b修改后:", b)
- }
- /**
- 从打印结果可以看出这里传入对是值类型,修改person内容并不会修改person原始值
- */
- func modifyPerson(per person) {
- per.Age = 18
- fmt.Println("修改时:", per)
- }
- func modifyPersonPointer(per *person) {
- per.Age = 19
- fmt.Println("修改时:", per)
- }

运行结果:
1
2
3
4
5
6
7
8
|
a修改前: {liang 29} 修改时: {liang 18} a第一次修改后: {liang 29} 修改时: &{liang 19} a第二次修改后: {liang 19} b修改前: &{xuli 27} 修改时: &{xuli 19} b修改后: &{xuli 19} |
二、匿名结构体以及结构体内嵌案例

- package main
- import (
- "fmt"
- )
- /**
- 结构体嵌套,使用对就是匿名结构体
- */
- type person struct {
- UserName string
- UserAge int
- Constact struct{
- Phone, City string
- }
- }
- func main() {
- /**
- 匿名结构体对应用案例
- */
- st := &struct {
- Name string
- Age int
- }{
- Name : "liang",
- Age : 29,
- }
- fmt.Println(st)
- /**
- 机构体嵌套打印
- */
- per := person{UserName: "liangyongxing", UserAge: 29}
- per.Constact.Phone = "15701183662"
- per.Constact.City = "北京"
- fmt.Println(per)
- }

运行结果:
1
2
|
&{liang 29} {liangyongxing 29 {15701183662 北京}} |
三、结构体的内嵌组合模拟继承案例

- package main
- import (
- "fmt"
- )
- /**
- 这里说对是结构体对组合,它对功能类似于其他语言对继承
- */
- type Human struct {
- sex int
- }
- type teacher struct {
- Human
- Name string
- Age int
- }
- type Student struct {
- Human
- Name string
- Age int
- }
- func main() {
- /**
- 在初始化对时候Go将嵌入对结构名称当成属性一样对待,将对应Human作为属性,这样可以在初始化对时候直接赋值
- 第二种赋值方式可以通过符号 . 来操作赋值
- */
- tea := teacher{Name: "teacher", Age: 36, Human: Human{sex: 1}}
- // tea.Human.sex = 1 或者 tea.sex = 1
- stu := Student{Name: "student", Age: 15, Human: Human{sex: 2}}
- //stu.Human.sex = 2 或者 tea.sex = 2
- /**
- 1. 既然结构嵌入进来来,就和其他语言继承一样,可以直接使用父类对属性,即 tea.sex = 1 也是可以对
- 2. 那 1 方式简单为什么还要保留 tea.Human.sex = 1 这种方式呢?是因为为来防止外部引用有同名对属性,为了区分
- */
- fmt.Println(tea)
- fmt.Println(stu)
- }

运行结果:
1
2
|
{{1} teacher 36} {{2} student 15} |
GO语言基础之struct的更多相关文章
- GO_06:GO语言基础之struct
结构struct 1. Go 中的struct与C中的struct非常相似,并且Go没有class 2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首 ...
- C#语言基础
第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...
- C语言基础回顾
第一章 C语言基础 1. C语言编译过程 预处理:宏替换.条件编译.头文件包含.特殊符号 编译.优化:翻译并优化成等价的中间代码表示或汇编代码 汇编:生成目标文件,及与源程序等效的目标的机器语言代码 ...
- 【GoLang】GO语言系列--002.GO语言基础
002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...
- 语言基础:C#输入输出与数据类型及其转换
今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...
- 01_C语言基础
内容提要: 1. C语言概述2. 数据类型.运算符与表达式3. C语言程序结构 4. VC6.0使用练习 知识详解01:C语言的历史 1. C语言与其它语言比较 汇编语言: (1).可直接对硬件进行操 ...
- C语言基础复习总结
C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...
- Go语言基础(二)
Go语言基础(二) 跟着上篇,继续看Go基础 一.变量作用域 与C类似,有全局变量.局部变量.形参之分 package main import "fmt" // 全局变量 var ...
- Go语言基础之反射
Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
随机推荐
- Java内存是怎么管理的
JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...
- 手机html根据手机分辨率网页文字大小自适应
问题:不同手机型号屏幕尺寸大不相同,导致同样的文字,有的显示一行,有的显示多行. 通过查资料和自己的尝试解决:网页开发习惯的px单位,手机html开发不适用. 源代码如下: <!DOCTYPE ...
- curl_get和curl_post,伪造请求头,绕过防盗链下载文件
//curl-get function curl_get($url, $timeout = 10) { $ch = curl_init();//初始化 curl_setopt($ch, CURLOPT ...
- POI2018
[BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...
- 友好的KVO
更友好的KVO 前言 观察者模式是大家在开发过程中每个人都要使用的一种设计模式,在iOS的开发流程中,KVO则是这一开发模式的主要实践手段,观察一个属性,当属性值发生变化的就能能够拿到这个属性的新.老 ...
- Elasticsearch快速入门案例
写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...
- ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)
catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...
- 使用NFS启动Tiny4412开发板根文件系统
1.Ubuntu14.04上搭建NFS服务 1.1.安装NFS服务 $ sudo apt-get install nfs-kernel-server //安装NFS服务 1.2 创建Tiny ...
- FT232H USB转串口,I2C,JTAG高速芯片
随着FT232H USB2.0高速芯片的发布,英商飞特蒂亚公司(FTDI)进一步巩固了其在USB接口集成电路产品的地位.此款多功能的单通道USB转UART/FIFO接口设备可通过EEPROM配置为各种 ...
- 能够区分光驱的类型么?比如CDROM、DVD还是CD-RW
http://www.jubao163.com/it/bianchengwendang/2007-06-17/14948.shtml typedef struct _SCSI_PASS_THROUGH ...