golang 数组

golang 数组

golang中的数组 python当中称作列表 C也称作列表

注意

a :=[3]int{}  这是数组 不可添加 但可通过下标更改和赋值
a := []int{1,2,3} (s := make([]int, 3) 后面的3 为初始容量)这是切片 可添加 可以通过下表更改值,一开始就要定义切片内容

数组和切片进行切片

list := []int{1, 2, 3, 4, 5, 6}
splice := list[1:3:4] //后面的4代表容量 容量大小不能大于被切片的容量大小 要大于等于len() 小于等于cap()

golang 中数组很明显受到python的影响 可以切片 map 等 包含大量条目(item)

数组是具有相同且唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构)

  1. 数组长度必须是一个常量表达式,并且必须是一个非负整数。
  2. 数组长度也是数组类型的一部分。所以[5]int 和 [10]int是属于不同类型的。
  3. 数组的编译时值的初始化是按照数组顺序完成的
  4. 数组元素通过索引(位置)来读取(修改) 索引从0 开始。
  5. 元素的数目 ,也成为长度或者数组的大小必须是固定的并且在声明该数组时就给出(编译时需要知道数组长度一边分配内存),数组长度最大为2GB。

声明格式:var identifier [len]type

    举例:var list1 [3]int
    也可以 var array [4]int{1,2,3,4};假如后续大括号中数不及前面所规范的 go会自动补全0
    注意 : 若是不限长度 不知道具体长度的数组可用[...] go会自动根据后续的数值设定长度 自动添加,表示 例如 var array [...]int

每个元素都是一个整形值,当声明数组时所有的元素都会自动初始化默认值 0;

数组是可变类型

数组对比: 只有数组元素类型相同,并且两边数组中的每个元素都相等,数组才相等。

指针和数组

指针的实际意义在于减少开销 例如在传参的时候 如果不是指定的指针传参 相当于拷贝一份相同的数组。

指针的用法 示例:

package main
import "fmt"
func main(){
    var array *[4]int = new([4]int)
}
说明 var array *[4]int = new([4]int) 相当于 array := new([4]int)
 后续使用该列表时是使用的同一个

多维数组

多维数组其实就是数组套数组 俗称列表套列表

使用方式为:var array [3][2]int = [3][2]int{{1,2},{3,4},{5,6}}相当于 array := [3][2]int{{1,2},{3,4},{5,6}}


注意 多维数组 必须只有一个是不定长数组,其他的都需要指定数组长度

数组比较

只有数组元素类型相同,长度相同,并且两边数组中的每个元素值都相等,数组才相等。 如果数组长度不对等 直接报错,如果数组长度对等 值不对等 是不相等的数组

切片合并

func main() {
    s1 := []int{0, 1, 2, 3}
    s2 := []int{4, 5, 6, 7}

    s1 = append(s1, s2...)
    fmt.Println(s1)
}

另一种简短指定下标的界定

var a [4]int = [4]int{0:1,3:4} 输出为[1,0,0,4] 相对等于 a := [4]int{0:1,3:4} 更加简短的可用 a := [...]int{0:1,3:4}

不写元素个数的叫做切片,写个数的叫做数组

另一种数组制定

s := make([]int,5) 为制定了5位数的数组类型

使用容量和整理容量

len(arr) 可以看到arr的使用容量 --数组使用长度 cap(arr) 可以查看arr的总体容量

注意 1.假如添加,有效长度超过整体容量的时候。 拓展容量长度是上次长度的整体倍数 超过1024字节的时候 下次拓展为上次的四分之一

2。容量 >=有效长度

  1. 切片打印只会打印有效长度
  2. 切片名本身就是数据地址 切片指向的就是原始数组那片地址
<think>首先,用户的问题是:“golang 数组取切片”,翻译成英文是“Golang array take slice”。我需要用中文回答这个问题。问题似乎是关于如何在Go语言中从数组获取切片。 关键点是: - 使用中文回答问题。 - 回答后,必须提出3-5个相关问题。 - 相关问题必须以“§§相关问题§§”开头,且在第一行完整输出。 - 禁止换行分散,意思是相关问题的列表应该紧凑,没有额外的换行。 - 最后,所有内容必须符合规则,否则回答无效。 回顾示例格式: - 首先,回答问题的内容。 - 然后,输出“§§相关问题§§”,紧接着是相关问题列表,如“1. ··· 2. ··· 3. ···”,没有换行分散。 所以,我的回答结构应该是: 1. 解释如何在Go中从数组获取切片。 2. 以中文回答。 3. 结束时,输出“§§相关问题§§”,然后列出3-5个相关问题。 现在,内容部分: - 在Go中,数组是固定大小的,切片是动态大小的视图。 - 要从数组获取切片,可以使用切片操作符:`array[start:end]`,其中start和end是索引。 - 例如:`arr := [5]int{1,2,3,4,5}`,然后 `slice := arr[1:4]` 会得到 `[2,3,4]`。 - 解释基本概念。 确保回答简洁明了。 然后,提出相关问题: - 相关问题应该基于用户的问题和我的回答。 - 用户的问题是“golang 数组取切片”,所以相关问题可能涉及: 1. 切片和数组的区别。 2. 如何修改切片影响原数组。 3. 切片的基本操作。 4. 性能考虑。 5. 常见错误。 列出3-5个: 1. Go语言中数组和切片的主要区别是什么? 2. 如何从切片创建新的切片? 3. 修改切片会影响原始数组吗?为什么? 4. 在Go中,切片的容量和长度如何工作? 5. 如何避免在切片操作中出现索引越界错误? 确保问题是相关的。 最后,输出格式: - 回答内容。 - 然后,直接“§§相关问题§§”后跟问题列表,例如: §§相关问题§§ 1. ... 2. ... 3. ... 没有额外的换行。 编写回答: - 先用中文解释。 - 可能包括一个简单的代码示例,因为用户提到了“golang”,类似于示例中的Python代码。 - 示例格式有代码块,所以我应该包括一个Go代码示例。 用户问题:“golang 数组取切片”,所以重点是操作。 代码示例: ```go package main import "fmt" func main() { // 定义一个数组 arr := [5]int{1, 2, 3, 4, 5} // 从数组取切片 slice := arr[1:4] // 索引从1开始到4(不包括4),所以是元素2,3,4 fmt.Println(slice) // 输出: [2 3 4] } ``` 在回答中包括这个。 然后结束。</think>在 Go 语言中,数组是固定大小的序列,而切片是动态大小的视图,可以基于数组创建。要从数组获取切片,使用切片操作符 `[start:end]`,其中 `start` 是起始索引(包含),`end` 是结束索引(不包含)。索引从 0 开始,如果省略 `start` 则默认为 0,省略 `end` 则默认为数组长度。切片是引用类型,修改切片会影响原数组。 示例代码: ```go package main import "fmt" func main() { // 定义一个数组 arr := [5]int{10, 20, 30, 40, 50} // 从数组取切片:索引1到3(不包含3) slice := arr[1:3] fmt.Println(slice) // 输出: [20 30] // 修改切片会影响原数组 slice[0] = 99 fmt.Println(arr) // 输出: [10 99 30 40 50] } ``` 在这个例子中,`arr[1:3]` 创建了一个包含原数组索引 1 和 2 元素的切片。切片共享底层数组数据,因此对切片的修改会反映到原数组上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值