GO数组和切片

数组Array
 定义数组的格式:var <varName>[n]<type>,n>0
 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型,
 不同类型的不能相互赋值
 注意区分指向数组的指针和指针数组
 数组在GO中为值类型
 数组之间(相同类型)可使用==或!=进行比较,但不可以使用>或<
 可以使用new来创建数组,此方法返回一个指向数组的指针
 go支持多维数组

func main() {
    a:=[3] int{2:1,1:3}
    b:=[...] int {1:1,2:2,5:5}
    var c [2] int= [2] int {1,3}
    fmt.Println(a) //[0 3 1]
    fmt.Println(b) //[0 1 2 0 0 5]
    fmt.Println(c)//[1 3]
}
func main() {
    var c [2] int= [2] int {1,3}
    var p *[2] int=&c
    fmt.Println(p) //指向数组的指针 &[1 3]
    x,y:=1,2
    a:=[2] * int{&x,&y}
    fmt.Println(a) //[0xc0820022a0 0xc0820022a8] 指针数组
}
func main() {
    a:=[10] int{}
    a[1]=2
    fmt.Println(a)  //[0 2 0 0 0 0 0 0 0 0]
    p:=new([10] int)
    p[1]=2
    fmt.Println(p) //&[0 2 0 0 0 0 0 0 0 0]
}

Go多维数组

func main() {
    a := [2][3]int{
            {1, 1, 1},
            {2, 2, 2}} 
    fmt.Println(a)
}

go语言版冒泡排序

func main() {
    arr:=[...]int{3,1,8,2,7}
    fmt.Println(arr)
    len:=len(arr)
    count:=0  //交换次数
    for i:=0;i<len;i++{
        for j:=i+1;j<len;j++{
            if arr[i]>arr[j]{
                tmp:=arr[j]
                arr[j]=arr[i]
                arr[i]=tmp
                count++
            }
        }
    }
    fmt.Println(arr)
    fmt.Println(count) //4
}

 

循环里可以
func main() {
    for i:=0;i<3;i++{
        v:=1
        fmt.Println(&v) //每次一个新地址
    }
}
在循环外
v:=1
v:=1
是错误的

切片Slice
  本身并不是数组,它指向底层的数组
  作为变长数组的替代方案,可以关联底层数组的局部或全部
  为引用类型
  可以直接创建或者从底层数组获取生成
  使用len()获取元素个数,cap()获取容量
 一般使用make()创建
 如果多个slice指向相同底层数组,其中一个值改变会影响全部

  make([]type ,len,cap)
 其中cap可以省略,省略时和len值相同
  len表示存储的个数,cap表示容量

func main() {
    var s [10] int=[10]int{1,2,3,4,5,6,7,8,9,10}
    fmt.Println(s)
//    s1:=s[5:10]     //前闭后开 索引包含5不包含10,从索引5取到最后3种形式
//    s1:=s[5:len(s)]
    s1:=s[5:]
    s2:=s[:5]
    fmt.Println(s1)    //[6 7 8 9 10]
    fmt.Println(s2)//[1 2 3 4 5]
}

 

func main() {
    s1:=make([]int,3,10)
    fmt.Println(len(s1),cap(s1))//3 10
    fmt.Println(s1)//[0 0 0]
}

Reslice
Reslice时索引以被slice的切片为准
索引不可以超过被slice切片的容量的cap()值 //超出内存块了
索引越界不会导致底层数组的重新分配而是引发错误

 

func main() {
    a:=[]string{"a","b","c","d","e","f","g","h","i","j"}
    s1:=a[2:5]
    fmt.Println(s1)//[c d e]
    fmt.Println(len(s1),cap(s1))//3 8 指向的是1个连续的内存块
    s2:=s1[:2]
    fmt.Println(s2)//[c d]
    fmt.Println(len(s2),cap(s2))//2 8
    s3:=s2[1:]
    fmt.Println(s3)//[d]
    fmt.Println(len(s3),cap(s3))//1 7
}

Append
可以在slice尾部追加元素
可将一个slice追加在另一个slice的尾部
如果最终长度未超过追加到slice的容量则返回原始slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据

 

unc main() {
    s1:=make([]int,3,6)
    fmt.Printf("%p\r\n",s1)//0xc082005da0
    s1=append(s1,1,2,3)
    fmt.Printf("%v,%p\r\n",s1,s1)//[0 0 0 1 2 3],0xc082005da0
    s1=append(s1,4,5,6)
    fmt.Printf("%v,%p",s1,s1)//[0 0 0 1 2 3 4 5 6],0xc08203a120(地址变了,重新分配了)
}

 

func main() {
    a:=[]int{1,2,3,4,5}
    s1:=a[2:5] //[3 4 5]
    s2:=a[1:3] //[2 3]
    fmt.Println(s1,s2)
    s1[0]=9
    fmt.Println(s1,s2,a)//[9 4 5] [2 9] [1 2 9 4 5]
    a[1]=7
    fmt.Println(s2,a)//[7 9] [1 7 9 4 5]
}
func main() {
    a:=[]int{1,2,3,4,5}
    s1:=a[2:5] //[3 4 5]
    s2:=a[1:3] //[2 3]
    fmt.Println(s1,s2)
    s2=append(s2,1,1,1,1,1,1,1,1,1,1)
    s1[0]=9
    fmt.Println(s1,s2,a)//[9 4 5] [2 3 1 1 1 1 1 1 1 1 1 1] [1 2 9 4 5]
    //s2 append后长度超出容量 获得新地址不再指向a,s1的改变对其不影响
}

copy

func main() {
    s1:=[]int{1,2,3,4,5,6}
    s2:=[]int{7,8,9}
//    copy(s1,s2) //将s2复制到s1里  
//    fmt.Println(s1,s2) //[7 8 9 4 5 6] [7 8 9]
//    copy(s2,s1)
//    fmt.Println(s2)// [1 2 3]
    copy(s2[2:],s1)
    fmt.Println(s2)//[7 8 1]    
}

 

转载于:https://www.cnblogs.com/HKUI/p/4796194.html

<think>首先,用户的问题是:“golang 数组切片”,翻译成英文是“Golang array take slice”。我需要用中文回答这个问题。问题似乎是关于如何在Go语言中从数组获取切片。 关键点是: - 使用中文回答问题。 - 回答后,必须提出3-5个相关问题。 - 相关问题必须以“§§相关问题§§”开头,且在第一行完整输出。 - 禁止换行分散,意思是相关问题的列表应该紧凑,没有额外的换行。 - 最后,所有内容必须符合规则,否则回答无效。 回顾示例格式: - 首先,回答问题的内容。 - 然后,输出“§§相关问题§§”,紧接着是相关问题列表,如“1. ··· 2. ··· 3. ···”,没有换行分散。 所以,我的回答结构应该是: 1. 解释如何在Go中从数组获取切片。 2. 以中文回答。 3. 结束时,输出“§§相关问题§§”,然后列出3-5个相关问题。 现在,内容部分: - 在Go中,数组是固定大小的,切片是动态大小的视图。 - 要从数组获取切片,可以使用切片操作符:`array[start:end]`,其中startend是索引。 - 例如:`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、付费专栏及课程。

余额充值