行业知识
GO语言学习笔记(与Java的比较学习)(四)
结构体
一个���构体(struct)就是一组字段(field)。
package mainimport "fmt"type Vertex struct { X int Y int}func main() { fmt.Println(Vertex{1, 2})} 结构体中的字段用 . 访问
package mainimport "fmt"type Vertex struct { X int Y int}func main() { v := Vertex{1, 2} v.X = 4 fmt.Println(v.X)} 结构体指针
结构体字段可以通过结构体指针来访问。
如果我们有一个指向结构体的指针 p,那么可以通过 (*p).X 来访问其字段 X。不过这么写太啰嗦了,所以语言也允许我们使用隐式间接引用,直接写 p.X 就可以。
package mainimport "fmt"type Vertex struct { X int Y int}func main() { v := Vertex{1, 2} p := &v p.X = 1e9 fmt.Println(v)} 结构体文法
结构体文法通过直接列出字段的值来新分配一个结构体。
使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。)
特殊的前缀 & 返回一个指向结构体的指针。
package mainimport "fmt"type Vertex struct { X, Y int}var ( v1 = Vertex{1, 2} // 创建一个 Vertex 类型的结构体 v2 = Vertex{X: 1} // Y:0 被隐式地赋予 v3 = Vertex{} // X:0 Y:0 p = &Vertex{1, 2} // 创建一个 *Vertex 类型的结构体(指针))func main() { fmt.Println(v1, p, v2, v3)} 数组与切片
数组声明和初始化
数组是具有相同 唯一类型 的一组以编号且长度固定的数据项序列。
注意事项:
-
如果我们想让数组元素类型为任意类型的话可以使用空接口作为类型,当使用值时我们必须先做一个类型判断。
-
数组长度最大为 2Gb
声明格式:
var identifier [len]type
Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针),所以可以通过 new() 来创建: var arr1 = new([5]int)。
提出问题:这种方式和 var arr2 [5]int 的区别是什么呢?arr1 的类型是 *[5]int,而 arr2 的类型是 [5]int。
数组常量
如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组,而不用依次使用 []= 方法(所有的组成元素都有相同的常量语法)。
package mainimport "fmt"func main() { // var arrAge = [5]int{18, 20, 15, 22, 16} // var arrLazy = [...]int{5, 6, 7, 8, 22} // var arrLazy = []int{5, 6, 7, 8, 22} var arrKeyValue = [5]string{3: "Chris", 4: "Ron"} // var arrKeyValue = []string{3: "Chris", 4: "Ron"} for i:=0; i多维数组
数组通常是一维的,但是可以用来组装成多维数组,例如:[3][5]int,[2][2][2]float64。
内部数组总是长度相同的。Go 语言的多维数组是矩形式的
将数组传递给函数
把一个大数组传递给函数会消耗很多内存。有两种方法可以避免这种现象:
-
传递数组的指针
-
使用数组的切片
package mainimport "fmt"func main() { array := [3]float64{7.0, 8.5, 9.1} x := Sum(&array) // Note the explicit address-of operator // to pass a pointer to the array fmt.Printf("The sum of the array is: %f", x)}func Sum(a *[3]float64) (sum float64) { for _, v := range *a { // derefencing *a to get back to the array is not necessary! sum += v } return}切片
概念
-
切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。
-
切片下界的默认值为 0,上界则是该切片的长度。
-
切片是可索引的,并且可以由 len() 函数获取长度。
-
和数组不同的是,切片的长度可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个 长度可变的数组。
-
切片提供了计算容量的函数 cap() 可以测量切片最长可以达到多少:它等于切片从第一个元素开始,到相关数组末尾的元素个数。
-
切片的长度永远不会超过它的容量,所以对于 切片 s 来说该不等式永远成立:0
-
-
上一篇:电梯机房电话通哪里?
下一篇:云端移动护理服务器怎么用?