Golang从入门到精通(十四):Golang结构体
来源:互联网 发布:win7新增打印机usb端口 编辑:程序博客网 时间:2024/05/18 03:02
Golang是一门很特殊的语言,虽然它出生比较晚,但是在很多地方却和现在的编程语言有所不同。现在的编程语言要么是函数式的、要么是面向对象的,而Go语言却有指针、结构体这些概念,并解决了C语言的一些坑。从这个角度上说,Golang可以看做C语言的填坑加强版。
结构体简介
Go 语言通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 new 函数来创建。
组成结构体类型的那些数据称为 字段(fields)。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。
结构体的概念在软件工程上旧的术语叫 ADT(抽象数据类型:Abstract Data Type)。在 C++ 它也存在,并且名字也是 struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样。因为 Go 语言中没有类的概念,所以在 Go 中结构体有着更为重要的地位。
结构体定义
结构体定义的一般方式如下:
type identifier struct { field1 type1 field2 type2 ...}
在结构体内部定义它们的成员变量和类型,只是类型要放到后面,并且变量之间不用逗号。
例如:
type Student struct { name string age int weight float32 score []int}
如果成员变量的类型相同的话,可以把它们写到同一行。所以type T struct {a, b int}
也是合法的语法,它更适用于简单的结构体。
结构体里的字段都有 名字,像 field1、field2 等,如果字段在代码中从来也不会被用到,那么可以命名它为 _。
结构体初始化
这里有两种方式可以初始化结构体,按原始字段顺序进行初始化和自定义字段顺序进行初始化。
在Go语言里可以直接使用 fmt.Println 打印一个结构体,默认输出可以很好的显示它的内容,类似使用 %v 选项。
就像在面向对象语言所作的那样,可以使用点号符给字段赋值:
structname.fieldname = value
同样的,使用点号符可以获取结构体字段的值: structname.fieldname
示例代码如下:
package mainimport ( "fmt")type Student struct { name string age int weight float32 score []int}func main() { stu01 := Student{"stu01", 23, 55.5, []int{95, 96, 98}} //按照字段顺序进行初始化 stu02 := Student{age: 23, weight: 55.5, score: []int{97, 98}, name: "stu02"} ///通过 field:value 形式初始化,该方式可以自定义初始化字段的顺序 stu01.age = 25 fmt.Println(stu01.age) fmt.Println(stu02)}
结构体new函数
关于结构体和指针的结合我们在下一关重点讲下,这里简单提下它们的组合使用。
一般在进行例如type T struct {a, b int}
的结构体定义之后
习惯使用t := new(T)
给该结构体变量分配内存,它返回指向已分配内存的指针。变量 t
是一个指向T
的指针,此时结构体字段的值是它们所属类型的零值。
声明 var t T
也会给 t 分配内存,并零值化内存,但是这个时候 t
是类型T
。在这两种方式中,t 通常被称做类型T
的一个实例(instance)
或对象(Object)
。var t *T = new(T)
等价于t := new(T)
。
一个简单的结构体new
函数的例子如下:
package mainimport "fmt"type struct1 struct { i1 int f1 float32 str string}func main() { ms := new(struct1) ms.i1 = 10 ms.f1 = 15.5 ms.str= "Chris" fmt.Printf("The int is: %d\n", ms.i1) fmt.Printf("The float is: %f\n", ms.f1) fmt.Printf("The string is: %s\n", ms.str) fmt.Println(ms)}
- Golang从入门到精通(十四):Golang结构体
- Golang从入门到精通(一):Golang介绍
- Golang从入门到精通(三):Golang数据类型
- Golang从入门到精通(八):Golang数组
- Golang从入门到精通(九):Golang字符串
- Golang从入门到精通(十):Golang函数
- Golang从入门到精通(十一):Golang方法
- Golang从入门到精通(十五):Golang指针
- Golang从入门到精通(十六):Golang接口
- Golang从入门到精通(十七):Golang反射
- Golang从入门到精通(二):Golang开发环境配置
- Golang从入门到精通(四):Golang变量定义和初始化
- Golang从入门到精通(五):Golang控制语句之if/else
- Golang从入门到精通(六):Golang控制语句之for
- Golang从入门到精通(七):Golang控制语句之switch
- Golang从入门到精通(十二):Golang复合数据之slice
- Golang从入门到精通(十三):Golang复合数据之map
- Golang从入门到精通(十八):Golang并发编程之Goroutine
- SpannableStringBuilder导致ellipsize失效(两者冲突)
- 移动端根据屏幕大小自动设置body字体大小
- 动态规划之零件加工
- 小学生开始学Python,还有什么能够阻挡我对Python的向往?
- 舒服的判断当前应用是否处于前台
- Golang从入门到精通(十四):Golang结构体
- 数组 链表 哈希表
- 数据结构实验之查找三:树的种类统计
- 【剧透】2017云栖大会·北京峰会——企业云上业务优化专场
- MongoDB查询
- Js频繁操作
- 20、Android开发基础之AndroidManifest和Activity
- 【神经网络与深度学习】卷积与反卷积
- 第十一周java作业