slice 数据类型大概原理是这样的:
type Slice struct {
base *elem_type;
len int;
cap int;
}
最容易和数组乱的就是下面的这样声明:
var a []int;
空长度表示变量是一个slice type, 不是空数组。
下面的使用方式:
var slice = []int{ 1,2,3,4,5 }; //这是产生一个数组, 然后产生一个slice
* 在这种背后创建了数组的情况, golang提供了reslice和cap函数功能
与下面的是不同的:
var ar = [...]int{ 1,2,3,4,5 };
golang中的slice与python中的list的slice是不同的.
1. [:8] 没有隐含的开始方式, 也没有隐含的结束方式
2. [1:999999999] 超出不等于到最后, 报错!
3. 没有负数的end, 报错.
func main() {
//创建一个slice, 它是引用[8]int的
ar := []int {0, 1, 2, 3, 4, 5, 6, 7};
//slice类型支持reslice, 調整它的引用情况
ar = ar[2:4];
fmt.Printf("length: %d\n", len(ar));
fmt.Println(ar[0]);
//怎么重新引用[8]int的完整长度呢? 答案是否定的
//提供了cap()函数
ar = ar[0:cap(ar)];
fmt.Printf("length: %d\n", len(ar));
fmt.Println(ar[0]);
}
输出結果是:
length: 2
2
length: 6
2
reslice无法修改slice的起始地址. 只能修改结束地址. capacity的长度会保存不变(除非引用了其它数组)
一步产生数组和slice变量:
var a = &[100]int{};
但是这样是不行的:
var a = &[100]int;
还可以使用make()函数:
a := make([]int, 100);
make([]int) 是等于[]int , 为一个slice对象
new([]int) 返回 *[]int , 为指向slice的指针变量.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.