3-2 切片的概念

array.go

package main

import (
    "fmt"
)

// 测试数组是值类型
func printArray(arr [5]int) {
    arr[0] = 100
    for i, v := range arr {
        fmt.Printf("index: %d value: %d\n", i, v)
    }
}
// 使用指针可以修改数组
func printArray1(arr *[5]int) {
    arr[0] = 100
    for i, v := range arr {
        fmt.Printf("index: %d value: %d\n", i, v)
    }
}

// 使用slice修改数组
func printArray2(arr []int) {
    arr[0] = 200
    for i, v := range arr {
        fmt.Printf("index: %d value: %d\n", i, v)
    }
}

func main() {
    var arr1 [5]int
    //arr2 := [3]int{1, 3, 5}
    // 让编译器数数组的长度
    arr3 := [...]int{2, 4, 6, 8, 10}
    //var grid [4][5]int

    fmt.Println("printArray(arr1)")
    printArray(arr1)
    fmt.Println("printArray(arr3)")
    printArray(arr3)
    fmt.Println("arr1 and arr3")
    fmt.Println(arr1, arr3)

    fmt.Println("printArray1(arr1)")
    printArray1(&arr1)
    fmt.Println("printArray1(arr3)")
    printArray1(&arr3)
    fmt.Println("arr1 and arr3")
    fmt.Println(arr1, arr3)

    fmt.Println("printArray2(arr1)")
    printArray2(arr1[:])
    fmt.Println("printArray2(arr3)")
    printArray2(arr3[:])
    fmt.Println("arr1 and arr3")
    fmt.Println(arr1, arr3)

    //fmt.Println(arr1, arr2, arr3)
    //fmt.Println(grid)

    if false {
    // 遍历arr3
    for i := 0; i < len(arr3); i++ {
        fmt.Println(arr3[i])
    }

    // 使用range遍历arr3
    for i, v := range arr3 {
        fmt.Println(i, v)
    }
    // 不需要下标,使用下划线表示
    for _, v := range arr3 {
        fmt.Println(v)
    }
    }
}

slices.go

package main

import "fmt"

// s []int不需要加长度,所以是slice
func updateSlice(s []int) {
    s[0] = 100
}

func main() {
    arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    // slice里面的数据结构,是array的视图,不是值类型
    fmt.Println("arr[2:6]", arr[2:6])
    fmt.Println("arr[:6]", arr[:6])
    s1 := arr[2:]
    fmt.Println("s1", s1)
    s2 := arr[:]
    fmt.Println("s2", s2)

    fmt.Println("After updateSlice(s1)")
    updateSlice(s1)
    fmt.Println(s1)
    fmt.Println(arr)

    fmt.Println("After updateSlice(s2)")
    updateSlice(s2)
    fmt.Println(s2)
    fmt.Println(arr)

    //切片的基础上继续切片
    fmt.Println("Reslice")
    fmt.Println(s2)
    s2 = s2[:5]
    fmt.Println(s2)
    s2 = s2[2:]
    fmt.Println(s2)

    //切片共享存储结构
    fmt.Println("Extending slice")
    arr[0], arr[2] = 0, 2
    s1 = arr[2:6]
    s2 = s2[3:5] // [s1[3], s1[4]]
    fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
    fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))
    //panic: runtime error: slice bounds out of range [:7] with capacity 6
    //fmt.Println(s1[3:7])
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值