go学习笔记(一)

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

目录

复合数据类型

数组


  • 长度固定,有零个或者多个元素组成。
  • 默认情况下,数组的每个元素都被初始化为元素类型零值。
  • 如果数组的长度位置出现...,则表示数组长度是根据初始值的个数来计算。如:q := [...]int{1, 2, 3}
  • 如果指定索引和对应值列表的方式初始化,这种情形下初始化索引的顺序是无关紧要的,而且没有用到的索引可以省略,未指定初始值的元素将使用零值初始化。如:r := [...]int{99: -1} 定义了一个含有100个元素的数组。
  • 如果一个数组的元素类型是可以比较的,那么数组类型也是可以比较的,可以使用==、!= 来进行比较,仅当数组长度和元素完全相等时,为true。长度不相等的数组进行等值对比是会报编译错误compile error: cannot compare [2]int == [3]int
slice


  • 变长序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中的类型。
  • 由指针、长度、容量构成。指针指向第一个slice元素对应的底层数组元素的地址(PS:slice的第一个元素并不一定就是数组的第一个元素)。长度对应slice的元素数目,长度不能超过容量。容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap分别返回slice的长度和容量。
  • 多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。
  • slice之间不能比较,意味着不能使用==、!=操作符来进行判断两个切片是否含有全部相等的元素。标准库中提供了bytes.Equal函数来判断两个字节型切片是否相等([]byte),对于其他类型的切片需要我们自己来展开比较。
    切片不支持比较的原因:

    • 切片元素是间接引用的,一个切片甚至可以包含自身(当slice声明为[]interface{}时,slice的元素可以是自身)
    • 因为slice元素是间接引用的,一个固定的slice值(指slice本身的值,不是元素的值)在不同时刻可能包含不同元素,因为底层数组的元素可能会被修改。

  • slice唯一合法的比较操作是和nil做比较(if summer == nil { /* ... */ })。
    零值的slice等于nil。
    nil值的slice没有底层数组
    nil值的slice的长度和容量都是0。但是也有非nil值的slice的长度和容量为0的,如[]int{}、make([]int, 3)[3:]。可以用[]int(nil)类型转换表达式来生成一个对应类型的slice的nil值。
    1. var s []int    // len(s) == 0, s == nil
    2. s = nil        // len(s) == 0, s == nil
    3. s = []int(nil) // len(s) == 0, s == nil
    4. s = []int{}    // len(s) == 0, s != nil
    复制代码

  • 如果要测试一个slice是否是空的,使用len(s) == 0来判断,而不是s == nil。
  • 内置的make函数可以创建指定类型、长度和容量的切片。容量部分可以省略,这种情况下,容量等于长度。make([]T, len, cap)
  • 尽管底层数组的元素是间接访问的,但是slice对应结构体本身的指针、长度和容量部分都是直接访问的。一般操作slice后会重新赋值给变量。如:runes = append(runes, r)
  • appendInt参数的省略号...代表接受变长的参数为slice
    1. func appendInt(x []int, y ...int) []int {
    2.     var z []int
    3.     zlen := len(x) + len(y)
    4.     // ...expand z to at least zlen...
    5.     copy(z[len(x):], y)
    6.     return z
    7. }
    复制代码
  • 要删除slice中间的某个元素并保存原有的元素顺序,可以通过内置的copy函数将后面的子slice向前依次移动一位完成
    1. func remove(slice []int, i int) []int {
    2.     copy(slice[i:], slice[i+1:])
    3.     return slice[:len(slice)-1]
    4. }
    复制代码
    如果删除元素后不用保持原来顺序的话,我们可以简单的用最后一个元素覆盖被删除的元素
    1. func remove(slice []int, i int) []int {
    2.     slice[i] = slice[len(slice)-1]
    3.     return slice[:len(slice)-1]
    4. }
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表