美文网首页
数组和切片(四)

数组和切片(四)

作者: 睦月MTK | 来源:发表于2020-01-14 10:32 被阅读0次
一、数组
  • 使用方法:
    • 声明数组 var <variableName> [<length>]<elementType>,一定要加长度!否则就变成切片了!
    • 数组初始化= [<length>/...]<elementType>{[value] , ...]}数组长度省略为...时,编译器会自动计算数组长度
    • 数组取值赋值同其他语言一样
  • 注意事项:
    • Go数组大小不可变更,数组大小是数组的固有属性之一
    • [3]int和[5]int是不一样的类型,不兼容!
    • 数组变量并不像C一样,是指向数组第一个元素所在的地址,更像是一种特殊的结构体

二、切片(重要)
  • 切片的概念:

    切片就是一个描述某一个数组的某一段连续序列的特殊结构,由一个指向对应数组的指针,一个描述当前表示的连续序列的长度(length)和一个描述当前序列能够最大达到的长度(capacity)的三个变量组成。

    切片的结构

    假设有数组a := [5]byte{"a","b","c","d","e"},则切片s := a[2,4]表示的是{"c","d"},长度为2,容量为3,指针指向对应数组的第三个元素

    操作后的切片
  • 切片用法:

    • 切片初始化
      • 对数组操作
      a := [5]byte{"a","b","c","d","e"}
      s := a[2,4] // s => {"c","d"}
      
      • 直接初始化(和数组不同在于中括号中不定义长度)
      q := []int{2, 3, 5, 7, 11, 13} // q => {2, 3, 5, 7, 11, 13}
      
      • 使用make函数(func make([]T, len, cap) []T)
      s := make([]byte, 5, 5) // s => {0,0,0,0,0}
      
    • 读取切片中指定元素,索引不能等于或超过切片长度,即使容量比长度大
    primes := [6]int{2, 3, 5, 7, 11, 13}
    s := primes[1:4]
    fmt.Println(s[2])
    //fmt.Println(s[3]) error!!!
    
    • 切片可以在切片的基础上再分配
    a := [5]byte{"a","b","c","d","e"}
    s := a[2,4] // s => {"c","d"}
    s = s[0,1] // s => {"c"}
    
    • 切片的开始和结束索引都可以省略,结束索引省略时默认为切片的长度且最大不可以超过切片的容量,开始索引省略时默认为从指针指向的那个元素开始,所以不要把开始索引设为负数(对,那种想法不可以)
    a := [5]byte{"a","b","c","d","e"}
    s := a[:] // s => {"a","b","c","d","e"}
    s = s[1:3] // s => {"b","c"}
    s = s[:] // s => {"b","c"}
    s = s[1:4] // s => {"c","d","e"}
    
    • 切片记录的是地址,所以如果更改某一个元素的值,则所有有关这篇区域的数组和切片的值都会变动!
    • 切片的长度由len(slice),容量由cap(slice)来得知
    • 只声明不赋值的切片类型变量为nil
    var s []int // s => nil
    
    • 切片也支持多维的,且不必保持子数组长度一样
    board := [][]string{
          []string{"_", "_", "_"},
          []string{"_", "_", "_"},
          []string{"_", "_", "_"},
    }
    
    // The players take turns.
    board[0][0] = "X"
    board[2][2] = "O"
    board[1][2] = "X"
    board[1][0] = "O"
    board[0][2] = "X"
    /*
    board => 
    X _ X
    O _ X
    _ _ O
    */
    
    • 使用内置append函数为切片添加新的值(func append(s []T, vs ...T) []T)
    primes := [6]int{2, 3, 5, 7, 11, 13}
    s := primes[1:4] // s => {3,5,7}
    s = append(s,5)// s => {3,5,7,5} primes => {2,3,5,7,5,13}
    

    如果需要操作的切片,容量足够,则相当于扩大切片的length,并且修改那些扩大范围内元素的值为指定的值
    如果容量不够,则会生成一个新的数组,并将原有元素和新增元素放在里面,并返回一个新的对应切片,容量会以2的倍数增加,长度则为实际切片的长度


参考文档:
[1] Go Slices: usage and internals

相关文章

  • 数组和切片(四)

    一、数组 使用方法:声明数组 var [],一定要加长度!否则就变成...

  • golang中数组、切片以及映射(map)的特点

    数组 数组和切片的创建方式不同 数组是值传递,除非声明为指针传递 数组是切片和映射的基石 切片 切片是围绕动态数组...

  • numpy -- ndarray 的各种索引和切片

    ndarray 的各种索引和切片 一维数组索引和切片 二维数组 多维数组 数组的copy 切片和索引 布尔数组 利...

  • Golang(四)数组和切片

    数组(Array) 什么是数组 Go 语言提供了数组类型的数据结构。 数组是具有相同唯一类型的一组已编号且长度固定...

  • ndarray数组的操作

    数组的索引和切片 一维数组的索引和切片: 多维数组的索引: 每个维度一个索引值,逗号分割 多维数组的切片:

  • numpy基础(二)

    numpy 数组索引及切片 一维数组的索引以及切片 在numpy 中一维数组的切片和python中的列表一样。切片...

  • Go语言编程--笔记2018-04-10

    书中35页谈到基于数组切片创建数组切片的时候 4. 基于数组切片创建数组切片类似于数组切片可以基于一个数组创建,数...

  • day02-07clice

    切片slise 切片的定义 初始化 长度len和容量cap 由数组得到切片 切片的容量cap是指底层数组从切片的第...

  • 数组和切片

    数组 需要掌握的知识点 1、数组不可边长2、如何声明数组3、如何初始化数组4、如何给数组赋值5、如何获取数组的值6...

  • 数组和切片

    数组和切片的区别 //数组,需要固定长度的 a=[5]int //切片是不需要固定长度的 b=[]int pack...

网友评论

      本文标题:数组和切片(四)

      本文链接:https://www.haomeiwen.com/subject/raqbactx.html