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]
}
时间: 2024-08-06 00:27:19

GO数组和切片的相关文章

GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度. 初始化 数组的初始化有多种形式,查看示例代码 , 在线运行示例代码 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5 [5] int {1,2} 长度为5的数组

GO语言总结(3)——数组和切片

上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: func test5() { var iarray1 [5]int32

go的数组和切片

对于GO的数组和切片的初步了解, 切边是数组的一个指针,切片的初始化有三种:一种是通过make,即 slice := make([]int,5,10) 另一种是通过:=指向一个已经存在的数组.即 slice := []int {1,2,3,4,5,6} 切片的切片不可初始化超过原始切片的cap值,比如: sliceA := make([]int,5,10) sliceB := sliceA[:11] 这个是不行的,11超过了sliceA的cap值(10),会报运行时异常. 对切片的append,

Go - 数组 和 切片

一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value1, value2, ... , valueN} 3) [...]Type{value1, value2, ... , valueN} 如下: func test5() { var arr1 [5]int32 var arr2 [5]int32 = [5]int32{1, 2, 3, 4, 5} a

Go数组、切片、映射的原理--简明解析

数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续内存块. 因为数组占用的内存是连续分配的,所以对数组的操作速度很快. 声明数组的方式:4种 var array1 [5]int array1 := [5]int{3,5,6,3,2} array1 := [...]int{3,4,7,8,1} //根据数组字面量中元素的个数来确定数组的长度 arra

GO的数组及切片

感觉在向PYTHON学一些数组方面的功能. package main import "fmt" func main() { var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} var mySlice []int = myArray[:5] fmt.Println("Elements of myArray: ") for _, v := range myArray { fmt.Print(v, &q

python运算学习之Numpy ------ 数组的切片索引与循环遍历、条件和布尔数组、

数组的切片索引: 数组的切片索引和列表非常类似,下面用代码简单说明 1 a = np.random.rand(16).reshape(4, 4) 2 print("数组a:\n", a) 3 print(a[-1][1:4]) 4 Out[1]: 5 数组a: 6 [[0.04175379 0.43013992 0.5398909 0.40638248] 7 [0.3305902 0.11958799 0.48680358 0.30755734] 8 [0.00893887 0.384

go 语言学习 - 数组和切片

package main import "fmt" func main(){ //数组 var a = [3]int{}//相当于[3]int{0,0,0} a[0] = 1 changeArray(a) fmt.Println(a) b := [...]int{1,2,3}//省略号符号表示让编译器根据后面初始化情况自动计算数组的长度,但这个长度是编译时确定的 fmt.Println(b) c := new([3]int) //new 返回的是地址,但是一样可以用 pointName

Go语言入门——数组、切片和映射

按照以往开一些专题的风格,第一篇一般都是“从HelloWorld开始” 但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了. 1.简介 Go是什么? Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.——摘自百度百科 Github地址 https://github.com/golang/go 官网地址 https://golang.org 中文网社区 https://

数组和切片

实际上就是个数组.底层是一个数组,切片内有这个数组引用,和切片的信息.var arrAge = [5]int{18, 20, 15, 22, 16}var arrLazy = [...]int{5, 6, 7, 8, 22}//...可以忽略var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}切片; x.y是切片改变x.y就是改变数组,向x.y添加数据也是改变数组. make创建一个切片:make([]int,len,c