go语言中实现切片(slice)的三种方式

Python011

go语言中实现切片(slice)的三种方式,第1张

定义一个切片,然后让切片去引用一个已经创建好的数组。基本语法如下:

索引1:切片引用的起始元素

索引2:切片只引用该元素位之前的元素

例程如下:

在该方法中,我们未指定容量cap,这里的值为5是系统定义的。

在方法一中,可以用arr数组名来操控数组中的元素,也可以通过slice切片来操控数组中的元素。切片是直接引用数组,数组是事先存在的,程序员是可见的。

通过 make 来创建切片,基本语法如下:

make函数第三个参数cap即容量是可选的,如果一定要自己注明的话,要注意保证cap≥len。

用该方法可以 指定切片的大小(len)和容量(cap)

例程如下:

由于未赋值系统默认将元素值置为0,即:

数值类型数组:    默认值为 0

字符串数组:       默认值为 ""

bool数组:           默认值为 false

在方法二中,通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素。

定义一个切片,直接就指定具体数组,使用原理类似于make的方式。

例程如下:

按照你的定义,slice是切片,而p是指针。切片是一个结构体头部+数组区域,其头部结构定义如下:

struct Slice

{ // must not move anything

byte* array // actual data

uintgo len // number of elements

uintgo cap // allocated number of elements

}

因此,slice的返回其实是头部值返回,函数内外的地址是不同的,这也导致主程序中,ss与pp不同。因为ss是新分配的,pp则是与子程序testInterface中的&slice相同。简单修改你的代码,通过输出对比,会非常清晰:

package main

import (

"fmt"

)

func testInterface() (slice interface{}, p interface{}) {

slice = make([]int, 10)

p = &slice

fmt.Println("debug:testInterface")

fmt.Println(&slice)//两个地址应该相同

fmt.Println(p) //两个地址应该相同

return slice, p

}

func main() {

fmt.Println("debug:main")

ss, pp := testInterface()

fmt.Println(&ss)

fmt.Println(pp) //应该与子程序的输出一致

}

另外,第一个问题就不用多解释,依然是值和指针不同了。