3.1.7. 可能混淆的¶
方法(method)&函数(function)¶
定义方法的一般格式:
func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
方法与函数之间最大的区别:
方法只是比函数多了一个接收器(receiver)
指针方法和值方法最大的区别:
如果想要方法改变接收器的数据,就在接收器的指针上定义该方法;
否则,就在普通的值类型上定义方法。
有类型T,方法的接收器为(t T)时我们称为值接收器,该方法称为值方法;
方法的接收器为(t *T)时我们称为指针接收器,该方法称为指针方法。
数组切片¶
数组定义:
1. 声明数组
var variable_name [SIZE] variable_type
实例:
var balance [10] float32
2. 初始化数组
2.1 设置数组大小
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
2.2 默认数组大小
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
3. 访问数组元素
var salary float32 = balance[9]
balance[9] = 23.1
切片定义:
切片是对数组的抽象
数组的长度不可改变,在特定场景中这样的集合就不太适用,于是就需要切片(动态数组)
与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大
1. 定义切片
var identifier []type
or
var slice1 []type = make([]type, len)
or 简写成
slice1 := make([]type, len)
or 也可以指定容量
slice1 := make([]T, length, capacity) // capacity可选
2. 切片初始化
2.1 直接初始化切片
s :=[] int {1,2,3 }
2.2 数组的引用
s := arr[startIndex:endIndex]
3. len() 和 cap() 函数
4. append() 和 copy() 函数
5. 空(nil)切片
var numbers []int
6. 切片截取
通过设置下限及上限来设置截取切片 [lower-bound:upper-bound]
切片&数组:
1. 指向原生数组的指针
2. 数组切片中元素个数
3. 数组切片已分配的存储空间
创建切片有2种方法:
1. 基于数组创建切片
2. 直接创建切片
切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对底层数组的抽象
// 基于数组创建数组切片
var mySlice1 int[] = myArray[:5] // (前5个元素)
var mySlice2 int[] = myArray[:] // 基于所有元素创建数组
// 直接创建数组切片
var mySlice1 int[] = make([]int, 5) // 初使元素个数为5, 初始值为0
var mySlice2 int[] = make([]int, 5, 10) // 初使元素个数为5, 初始值为10
mySlice3 := []int{1, 2, 3, 4, 5} // 创建并初使化包含5个元素的数组切片
//基于数组切片创建数组切片
oldSlice := []int{1, 2, 3, 4, 5}
newSlice := oldSlice[:3]
newSlice2 := oldSlice[:72] // 超出部分置0(不能超出cap())
// 内容复制
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{1, 2, 3}
copy(slice1, slice2) // 只复制slice2的前3个元素到slice1
copy(slice2, slice1) // 只复制slice1的前3个元素到slice2的前三个位置