zoukankan      html  css  js  c++  java
  • Golang基础——数据类型:切片

    切片:

    大小不确定的放在堆区(实际值),固定长度的在栈区(变量名:存地址)

    添加切片数据的时候,地址可能发生改变,当前内存不能连续并且足够大。

    扩容:<=1024 :两倍;> 1024 :每次扩容上一次的 1 / 4

    引用传递
    var a []int
    a = append(a, 1, 2, 3, 4, 5)
    fmt.Println(a)
    fmt.Printf("%T
    ", a)
    fmt.Println(len(a)) // 长度
    fmt.Println(cap(a)) // 容量
    var b = []int{1, 2, 3}
    fmt.Println(b)
    c := []int{1, 2, 3}
    fmt.Println(c)
    d := make([]int, 5, 10) // 长度 5,容量 10
    fmt.Println(d)
    fmt.Println(len(d))
    fmt.Println(cap(d))
    e := make([]int, 3)
    fmt.Println(e)
    e[0] = 111
    fmt.Println(e)
    

    切片截取固定长度:

    s := []int{1,2,3,4,5}
    s[0:3:5]  // 从0到3,取左不取右,s的容量为 5,容量不能超过原来的切片的容量
    // 地址和原来的切片重合,是原来切片的一部分,还是原来的地址。所以修改切片的内容,会影响原来的。
    

    切片拷贝:

    	a := []int{1, 25, 5} // [1 25 5]
    	var c []int
    	b := make([]int, 1) 
    	copy(b, a)          // 存储两个地址 a -> b
    	copy(c, a)
    	fmt.Println(a)
    	fmt.Println(b) // 有几位填充几位  [1]
    	fmt.Println(c) // []
    

    切片当做函数参数,引用传递:

    但是,append函数,向切片中添加数据时,地址将可能发生改变,不影响实参的地址。相当于,如果内存够用,就用原来的;不够用了,就新开辟内存地址。但是原来的实参切片还在原来的地址。

  • 相关阅读:
    Redis常用数据类型及应用场景之Set
    Redis常用数据类型及应用场景之List
    Redis常用数据类型及应用场景之Hash
    exists & not exists
    oracle 中 dblink 的简单使用
    DockerCompose之数据卷Volume
    DockerCompose之常见编排脚本
    160308-学习State Pattern Actor
    12.3-框架维护
    12.2-机器人协作系统
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14598933.html
Copyright © 2011-2022 走看看