Go基础(复杂类型):切片

切片

每个数组的大小都是固定的。而切片则为数组元素提供动态大小的、灵活的视角。在实践中,切片比数组更常用。


一、切片的定义

类型 []T 表示一个元素类型为 T 的切片。
切片通过两个下标来界定,即一个上界和一个下界,二者以冒号分隔:

a[low : high]

它会选择一个半开区间,包括第一个元素,但排除最后一个元素。
半开区间,包括前面不包括后面。
以下表达式创建了一个切片,它包含 a 中下标从 1 到 3 的元素:

a[1:4]

下面写一个例子:

package main

import "fmt"

func main() {

    //定义一个6位长度的数组
    primes := [6]int{2,4,5,7,9,11}
    fmt.Println(primes)

    //定义一个切片,去上面数组中,索引从1-3之间的三个数,1,2,3
    var  s []int  = primes[1:4]
    fmt.Println(s)

}

输出结果是:

[2 4 5 7 9 11]
[4 5 7]

二、切片就像数组的引用

切片并不存储任何数据,它只是描述了底层数组中的一段。
更改切片的元素会修改其底层数组中对应的元素。
与它共享底层数组的切片都会观测到这些修改。

下面来看一个例子:

package main

import "fmt"

func main() {
    names := [4]string{
        "John",
        "Paul",
        "George",
        "Ringo",
    }
    fmt.Println(names)

    //半开区间,使用切片的方式,a取names中的索引是0,1的数据
    a := names[0:2]
    //半开区间,使用切片的方式,b取names中的索引是1,2的数据
    b := names[1:3]
    fmt.Println(a)
    fmt.Println(b)

    //修改b切片中索引为0的值
    b[0] = "XXX"
    fmt.Println(b)

    //会发现,因为b切片中的索引为0的对应于数组names中的索引为0
    //改变了b切片中的值,names中对应的值也得到了改变
    fmt.Println(names)
}

看一下输出结果:

[John Paul George Ringo]
[John Paul]
[Paul George]
[XXX George]
[John XXX George Ringo]

三、切片文法

切片文法类似于没有长度的数组文法。
这是一个数组文法:

[3]bool{
  true, true, false}

下面这样则会创建一个和上面相同的数组,然后构建一个引用了它的切片:

[]bool{
  true, true, false}

下面来看一个例子:

package main

import "fmt"

func main() {

    //按照传统的数组创建一个3位长度的数组
    arr := [3]bool{
  true, true, false}
    fmt.Println(arr)

    //创建一个切片
    m := []bool{
  true, true, false}
    fmt.Println(m)

    //数组a和切片q,输出的效果是一样的

    //定义一个int类型的切片
    q := []int{2,4,5,64,32,53}
    fmt.Print
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值