切片,可以看成动态的数组,不需要指定具体的长度。结构体,就是一种可以将各种类型整合成一个大整体的方式,比如学生:姓名,性别,年龄,爱好。。。
一、切片 go语言的切片内存结构:地址,大小和容量。
从连续内存区域(数组,或切片)生成切片是常见的操作!
1.1 声明切片的方法
1)直接声明切片
var name []Type
备注:(1)与数组唯一的区别,就是这里不能指定长度!
(2)使用append方法,向切片添加元素!
实例:var nameSlice1 []string
nameSice1 = append(nameSice1 , "zhangsan")
nameSice1 = append(nameSice1 , "lisi")
2) 使用make()构造切片
make( []Type, size, cap )
备注:(1)make() 函数生成的切片一定发生了内存分配操作
更加精确控制,预分配的长度,空间大小
(2)可以直接给前size元素赋值,新元素依旧需要append添加
实例: nameSice2 := make([]string 2, 10)
nameSice2[0] = "zhangsan")
nameSice2 = append(nameSice2 , "wangwu)
1.2 给新切片赋值
从连续内存区域(数组,或切片)中得到切片:变量名[开始位置 : 结束位置]
1)切出的个数:结束位置-开始位置
2)切出的元素,不包含结束位置的元素
3)最后一个元素:变量名[len(变量名)]
4)缺省开始位置,从头开始
5)缺省结束位置,到结束为止
6)两个都缺省,则本身
7)两个都是0,表示空切片
实例: var arr[ 10] int = [10]int{0,1,2,3,4,5,6,7,8,9}
切片1:var silice1 []int = arr[5:10] //取出个数:10-5=5 ;切出结果:[5,6,7,8,9]
切片2: var slice2 []int = arr[:2] //取出前两个数;切出结果:[ 0,1]
切片3: var slice3 []int = arr[8:] //取出后两个数;切片结果: [8,9]
1.3 相关的API
(1)复制 copy( destSlice, srcSlice []T) int
copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制!返回值是实际复制个数!
实例:
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置
二、结构体 自定义新的类型的方法,可以由0或多个任意类型的值聚合的实体。
2.1 结构体定义
tyoe 类型名 struct {
字段1 字段1类型
字段2 字段2类型
...
}
其中,成员(or称为 字段),包含以下特性:1)字段必须拥有自己的类型和值;2)字段名必须唯一;3)字段也可以是结构体,如果是自身则必须是指针
访问成员,都是使用.来实现,比如: 结构体变量.字段名
实例: XY坐标系下的点:
type Point struct {
x int
y int
}
2.2 实例化 根据结构体定义,定义结构体变量,俗称实例化。
实例化方法,有三种:1)使用var实例化;2)使用new实例化;3)使用结构体地址实例化
1)使用var来实例化: var ins T
2)使用new创建指针来实例化:ins := new(T)
3)使用结构体地址实例化:ins := &T{}
取地址实例化是最广泛的一种结构体实例化方式!
实例:XY坐标系下的一个节点A
var A Ponint
pA := new(Point)
pA := &Point{}
2.3 初始化结构体变量的方式
给结构体的成员赋值的方法有两种:1)键值对,给部分变量赋值;2)值列表,初始化所有变量。
1)键值对 格式:
ins := 结构体类型名{
字段1: 字段1的值,
字段2: 字段2的值,
…
}
2)值列表 格式:
ins := 结构体类型名{
字段1的值,
字段2的值,
…
}
备注:(1)键值对,可对部分变量赋值,不需要的可以不赋值。键值对,不要求顺序!
(2)值列表,必须给出全部字段的值。顺序与结构体定义一致,包括类型。
(3)键值对和值列表,不可以混用!!!
实例:XY坐标系下的一个节点A(3,4)
键值对:
A = Point{
x: 3,
y: 4,
}
值列表:
A = Point{3,4}
《遗漏点,后续补充》