【Golang 基础】Go 语言的切片(Slice)

Go 语言的切片(示例代码

Slice是一个通过指向数组底层,来进行变长数组的实现。

  • 定义切片的格式:var <sliceName> []<type>
package basic

import "fmt"

func DeclaratSlice(){
    
    // 定义一个空 slice
    var slice1 []int
    fmt.Println(slice1) // []

    // 定义一个 slice 并赋初始值
    slice2 := []int{ 1, 3, 4 }
    fmt.Println(slice2) // [1 3 4]
}
  • 通过 make([]<type>, len, cap)格式来创建 slice。其中,len表示 slice的长度,cap表示 slice的容量;cap的值默认情况下与 len相等,cap可以省略
package basic

import "fmt"

// 通过 make 声明 切片
func DeclaratSliceByMake() {
    var slice1 = make([]int, 6)
    fmt.Println(slice1) // [0 0 0 0 0 0]
}

可以通过内置函数 len()cap()可以获取 slicelencap的值

// 通过 make 声明 切片
func DeclaratSliceByMake() {
    var slice1 = make([]int, 6)
    fmt.Println(slice1) // [0 0 0 0 0 0]

    fmt.Println("len(slice1) = ", len(slice1)) // len(slice1) =  6
    fmt.Println("cap(slice1) = ", cap(slice1)) // cap(slice1) =  6
}

Reslice

  Reslice表示将一个 Slice再次 Slice

  • Resliceslice都是指向同一底层数组;
  • Reslice的索引以 slice的索引为准,其最大容量(cap)为 slice的容量;
  • 索引越界不会导致底层数组的重新分配,而是引发错误。
package basic

import "fmt"

// Reslice
func Reslice() {
    array := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    slice1 := array[2:5]
    slice2 := slice1[0:6]

    fmt.Println("array=", array, "len=", len(array), "cap=", cap(array)) // array= [0 1 2 3 4 5 6 7 8 9] len= 10 cap= 10
    fmt.Println("slice1=", slice1, "len=", len(slice1), "cap=", cap(slice1)) // slice1= [2 3 4] len= 3 cap= 8
    fmt.Println("slice2=", slice2, "len=", len(slice2), "cap=", cap(slice2)) // slice2= [2 3 4 5 6 7] len= 6 cap= 8
}

Slice 的操作

  • append

   append()用于在 slice后最追加新的元素,这些元素保存到底层数组,并不会影响原 slicez,它返回变更后新的 slice对象。

  如果追加的元素超出之前的 slice容量,则重新分配数组并拷贝原数据,并不影响底层数组。

package basic

import "fmt"

func SliceByAppend() {
    array := [...]int{0, 1, 2, 3}

    slice := array[:2]
    fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1], cap = 4
    
    slice = append(slice, 10)
    fmt.Printf("%p %v\n", &array, array) // 0xc42001c160 [0 1 10 3] cap = 4
    fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc42001c160 [0 1 10], cap = 4
    
    slice = append(slice, 15, 20)
    fmt.Printf("%p %v cap = %d \n", &array, array, cap(array)) // 0xc42001c160 [0 1 10 3] cap = 4
    fmt.Printf("%p %v, cap = %d\n", slice, slice, cap(slice)) // 0xc420012240 [0 1 10 15 20], cap = 8
}
  • copy

  copy(目标 slice, 被拷贝的 slice),用于拷贝 slice,返回值为拷贝的个数。

package basic

import "fmt"

func SliceByCopy() {
    sliceA := []int{1, 2, 3, 4, 5}
    sliceB := []int{5, 4}
    
    copyCount := copy(sliceA, sliceB)
    
    fmt.Println(copyCount) // 2
    
    fmt.Println(sliceA) // [5 4 3 4 5]
    fmt.Println(sliceB) // [5 4]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值