zoukankan      html  css  js  c++  java
  • Golang 切片

    1. 为什么需要切片,和数组区别?

    数组是定长的,切片是变长的

    底层是数组存储

    声明

    var identifier []type

    区分数组是[]中没有数字

    var arr = [3]int {1, 2, 3}
    fmt.Println(arr)
    var sl = []int {1, 2, 3}
    fmt.Println(sl)
    fmt.Printf("类型 arr:%T, sl:%T", arr, sl

    输出

    [1 2 3]
    [1 2 3]
    类型 arr:[3]int, sl:[]int
    

    2. 声明

    2.1 通过 var identifier []type

    2.2 通过make,如

    var slice1 []type = make([]type, len,capacity)

    其中 capacity 是容量,可省略;len是长度;需capacity >= len

    3. 定义

    3.1 直接初始化

    var sl = []int {1, 2, 3}

    3.2 引用数组、切片

    s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
    var num3 = s[6:7]

    4. 添加元素、扩容

    4.1 通过下标直接复制

    4.2 通过append追加

    var nums2 = make([]int, 3, 4)
    fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)
    nums2 = append(nums2, 1, 2,3)
    fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

    输出

    len:3 cap:4 slice:[0 0 0]len:6 cap:8 slice:[0 0 0 1 2 3]

    说明:make([]int, 3, 4) 已经给前三个元素复制0了,append的时候在后面追加;当切片长度大于容量时会自动扩容,容量变为原来的二倍

    另外,不仅可以扩容单个元素,还可以扩容数组、切片

    var num_tmp = []int{5,5,5}
    nums2 = append(nums2, num_tmp...)

    此时注意num_tmp后面需要加...表示添加里面的元素

    5. 长度len, 容量cap

    var nums2 = make([]int, 3, 4)
    nums2[0] = 0
    nums2[1] = 1
    nums2[2] = 2
    fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

    输出

    len:3 cap:4 slice:[0 1 2]

    :此时访问nums2[3]是不行的,因为并未初始化

    panic: runtime error: index out of range [3] with length 3

    6. copy

    num4 := make([]int, len(nums2), 2 * len(nums2))
    copy(num4, nums2)
    nums2[0] = 1000
    fmt.Println(num4, nums2)
    fmt.Printf("%p, %p", num4, nums2)

    拷贝后两个切片指向不同的数组(地址不同),nums2改了其中的一个元素,对num4没影响(深拷贝)

    输出

    [0 0 0 1 2 3 5 5 5] [1000 0 0 1 2 3 5 5 5]
    0xc000098090, 0xc000096000

  • 相关阅读:
    Web架构中的前端页面缓存
    Drools 使用Spring中的bean
    大型Java多用户商城系统设计开发的心得和困难
    正则表达式
    No ideal,no future
    关于sql 2005 assembly
    修改aspx输出的action地址 
    关于[META HTTPEQUIV="REFRESH" CONTENT=2]
    最简单的兼容firefox和ie的锚点方法
    【IIS】检索COM类工厂中CLSID为{0002450000000000C000000000000046}的组件时失败,错误: 80070005
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/12239111.html
Copyright © 2011-2022 走看看