MENU

Go 学习笔记:切片slice

August 23, 2021 • Golang

在Go中,因为数组的长度是不可变的,这就会导致在某些场景中的尴尬场面。因此,go提供了一种“动态数组”——slice,这种类型长度不固定,可以扩容。具体可以参考Python的”列表“,不过他俩还是区别蛮大的

首先我们可以创建一个切片

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:06:39
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice1 := make([]int, 20, 30) 
    // 类型、切片长度、预留长度(可选)
    fmt.Println(slice1)
    fmt.Printf("%T\n", slice1) // []int
}

make 函数是用来为slice map channel 分配内存的。当然,除了make函数以外,还有其他的方式

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:27:08
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice1 := []int{1, 2, 3}
    fmt.Println(slice1)
    fmt.Printf("%T\n", slice1) // []int
}

切片也可以利用数组初始化

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:31:58
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    slice1 := array[:]
    fmt.Println(slice1)
    fmt.Println(array)
    fmt.Printf("%T\n", slice1)
    fmt.Printf("%T\n", array)
}

我们也可以不引用完

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:32:42
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    slice1 := array[0:2] // [1 2], 取左闭右开的一个区间
    fmt.Println(slice1)
    fmt.Println(array)
    fmt.Printf("%T\n", slice1)
    fmt.Printf("%T\n", array)
}

当然,go提供了两个函数,用来获取slice的长度与切片最大长度

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:44:12
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice := make([]int, 5, 10)
    fmt.Println(len(slice), cap(slice)) // 5, 10
}

slice也可以像Python的列表一样切片

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:50:00
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
    fmt.Println(slice[0:5])
    fmt.Println(slice[:])
    fmt.Println(slice[:5])
    fmt.Println(slice[2:])
}

如果想要拓展切片的空间,可以使用appendcopy函数

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:52:00
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
    fmt.Println(len(slice), cap(slice))
    slice = append(slice, 11) // 在最后面追加元素
    fmt.Println(len(slice), cap(slice)) 
    // 追加后,预留的空间翻倍了
    fmt.Println(slice)
}

copy函数可以帮助你将一个小的切片复制到另一个大的切片中去

/*
 * @Author: NorthCityChen
 * @LastEditTime: 2021-08-23 17:56:58
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCityChen All rights reserved.
 */
package main

import (
    "fmt"
)

func main() {
    slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
    slice1 := make([]int, 11, 22)
    copy(slice1, slice)
    fmt.Println(slice, cap(slice))
    fmt.Println(slice1, cap(slice1))

    fmt.Println(slice)
    fmt.Println(slice1)
}
作者:NorthCity1984
出处:https://grimoire.cn/golang/go10.html
版权:本文《Go 学习笔记:切片slice》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任