Go的学习路程:切片|Go 主题月

306 阅读1分钟

切片本身并非动态数组或数组指针。他内部通过指针引用底层数组,设定相关属性将数据读写操作限定在指定区域内。Go 中的切片概念与 Python 中的切片概念类似,但是不如 Python 中的切片灵活。

可基于数组或数组指针来创建切片,以开始和结束索引位置确定所引用的数组片段。不支持反向的索引,实际范围是一个右半开区间。

通过 arr[begin:end] 的方式来创建切片。其中 arr 是一个已将创建好的数组。begin 是切片起始索引位置可以省略,省略表示 0。end 是切片结束索引位置切片数据不包括该索引上的元素,end 也可以省略,省略表示数组长度。

package main
import "fmt"

func main() {
    s := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 := s[:] // 相当于 s[0:10]
    fmt.Println(s1) // [0 1 2 3 4 5 6 7 8 9]

    s2 := s[1:6]
    fmt.Println(s2) // [1 2 3 4 5]

    s3 := s[4:] // 相当于 s[4:10]
    fmt.Println(s3) // [4 5 6 7 8 9]

    s4 := s[:8] // 相当于 s[0:8]
    fmt.Println(s4) // [0 1 2 3 4 5 6 7]
}

如上代码定义了一个长度为 10 的 int 类型的数组。通过 s[:] 的方式获取一个全量的切片 s1。

和数组一样,切片同样使用下标访问元素内容。其实下标为 0,但并非对应的底层数组的真实下标位置。

package main
import "fmt"

func main() {
    s := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 := s[4:]

    for i:=0; i<len(s1); i++ {
            fmt.Printf("%d ", s1[i])
    }
    
    // 输出 4 5 6 7 8 9
}