GO_06: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 : ,
}
//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 : ,
}
fmt.Println("b修改前:", b)
modifyPersonPointer(b)
fmt.Println("b修改后:", b)
} /**
从打印结果可以看出这里传入对是值类型,修改person内容并不会修改person原始值
*/
func modifyPerson(per person) {
per.Age =
fmt.Println("修改时:", per)
} func modifyPersonPointer(per *person) {
per.Age =
fmt.Println("修改时:", per)
}
运行结果:
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 : ,
}
fmt.Println(st) /**
机构体嵌套打印
*/
per := person{UserName: "liangyongxing", UserAge: }
per.Constact.Phone = ""
per.Constact.City = "北京"
fmt.Println(per)
}
运行结果:
&{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: , Human: Human{sex: }}
// tea.Human.sex = 1 或者 tea.sex = 1
stu := Student{Name: "student", Age: , Human: Human{sex: }}
//stu.Human.sex = 2 或者 tea.sex = 2
/**
1. 既然结构嵌入进来来,就和其他语言继承一样,可以直接使用父类对属性,即 tea.sex = 1 也是可以对
2. 那 1 方式简单为什么还要保留 tea.Human.sex = 1 这种方式呢?是因为为来防止外部引用有同名对属性,为了区分
*/
fmt.Println(tea)
fmt.Println(stu)
}
运行结果:
{{1} teacher 36}
{{2} student 15}
GO_06:GO语言基础之struct的更多相关文章
- 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语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
随机推荐
- Scrum Meeting 11.06
成员 今日任务 明日计划 用时 徐越 学习ListView+simpleAdapter,actionBar.阅读并修改前端代码 继续修改前端代码.完善数据库 4h 赵庶宏 构建后端数据库,进行完善 ...
- C#窗体随机四则运算 (第四次作业)
---恢复内容开始--- 增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:2)用 ...
- cobbler技术详解(是PXE二次详解)
Cobbler是PXE的二次封装,使用Python语言开发, 可以用来快速建立 Linux 网络安装环境,它已将 Linux 网络安装的技术门槛,从大专以上文化水平,成功降低到初中以下,连补鞋匠都能学 ...
- 软工网络15团队作业8——敏捷冲刺日志的集合贴(Beta阶段)
Beta阶段 第 1 篇 Scrum 冲刺博客 第 2 篇 Scrum 冲刺博客 第 3 篇 Scrum 冲刺博客 第 4 篇 Scrum 冲刺博客 第 5 篇 Scrum 冲刺博客 第 6 篇 Sc ...
- yii 验证码 CCaptcha的总结(转)
今天用到yii的验证码 ccaptcha,经过在网上搜寻 找到以下例子: 1.在controller中加入代码 (1)启用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 &l ...
- sublinme 快捷键格式
{"keys": ["ctrl+shift+f"], "command": "reindent" , "arg ...
- Mysql 错误相关
有几天没启动本地的 MySQL 了,今天打开小海豚,直接给我弹出了连接失败,这是怎么回事,就直接进入命令行,发现也有问题,输入密码后一闪而过,也没有什么提示信息给我,百度了先,都说是修改 MySQL ...
- java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
微信小程序前后台使用get方式传参时报错如图.但在微信开发平台和苹果测试都没事,在安卓手机上就报这个错,猜想原因是get传递了汉字的原因. 尝试了下在后台输出从前台获取的参数,但是后台什么也没有获取到 ...
- 用Python实现的数据结构与算法:快速排序
一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...
- 文件查找 locate 和 find
locate locate命令依赖于一个数据库文件,系统默认每天会检索一次系统中的所有文件,然后将检索到的文件记录到数据库中; 在执行查找时,可直接到数据库中查找记录,所以locate比find反馈更 ...