Thursday, January 7, 2010

golang中的slice

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.