GO之数组切片

简介:
数组的容量和长度是i样的,cap()函数和len()函数均输出数组的容量(即长度)
package main
import "fmt"
func main() {
    a := [5]int{6, 7, 8, 9, 10}
    fmt.Println(len(a))
    fmt.Println(cap(a))
}

切片

-本身并不是数组,它指向底层的数组

-作为变长数组的替代方案,可以关联底层数组的局部或全部

-为引用类型

-使用len()获取元素的个数,cap()获取容量

-一般使用make()创建

-如果多个slice指向相同底层数组,其中一个的值改变会影响全部

-make([]T,len,cap)

-其中cap 可以省略,则和len的值相同

package main

import "fmt"

func main(){

var s1[10]int 

s1:=[10]int{1,2,3,4,5,6,7,8,9} 

fmt.Println(s1)

s2 :=s1[:9]

s3 :=s1[4:8] //包含开始不包含结束

fmt.Println(s2)

}


使用make声明数组

s1 :=make([]int,3,9)


package main

import "fmt"

func main(){

    s1 :=make([]int,3,10)

fmt.Println(s1)

}

--从一个slice取出一个新的slice

Reslice:从一个slice取出一个新的slice

Reslice时索引被slice的切片为准

索引不可以超过被slice的切片的容量cap()值

索引越界不会导致底层数组的重新分配而是引发错误

Append

可以在slice尾部追加元素

可以将一个slice追加在另一个slice尾部

如果最终未超过追加到slice的容量则返回原始slice//内存地址没有改变

如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据//重新分配内存地址

package main

import "fmt"

func main(){

    s1 :=make([]int,3,6)

fmt.Println("%v  %p\n",s1,s1)

s1=append(s1,1,2)

fmt.Println("%v %p\n",s1,s1)

}

Copy

package main

import "fmt"

func main(){

    s1 :=[]int{1,2,3,4,5,6,7}

s2 :=[]int{7,8,9}

copy(s1,s2) //s2的内容拷贝到s1中去,短的数组拷贝到长的数组,改变长的几个

fmt.Println(s1)

}


package main

import "fmt"

func main(){

    s1 :=[]int{1,2,3,4,5,6,7}

s2 :=[]int{7,8,9}

copy(s2,s1) //长的数组拷贝到短的数组中去,只会匹配短的个数长度

fmt.Println(s2)

}


package main

import "fmt"

func main(){

    s1 :=[]int{1,2,3,4,5,6,7}

s2 :=[]int{7,8,9}

copy(s2[2:2],s1[1:3])//拷贝到s2的指定并覆盖原有的数据

fmt.Println(s2)

}


package main

import "fmt"

func main(){

    s1 :=[]int{1,2,3,4,5,6,7,1,1,1}

s2 :=[]int{7,8,9,11,22,33,44,55,66,77,88}

copy(s2[10:],s1[1:3])//拷贝到s2的指定并覆盖原有的数据.若复制的值超过被复制的数组,只会留下部分复制的数据,s1的值只会在s2留下一个

fmt.Println(s2)

fmt.Println(s1[1:3])

}

##遍历、修改切片

package main
import "fmt"
func main() {
    slice0 := []string{"a", "b", "c", "d", "e", "f"}
    fmt.Printf("\n*****元素遍历*****")
    for _, value := range slice0 {
        fmt.Println(value, " ")
    }
    fmt.Println("\n*****索引遍历******")
    for index := range slice0 {
        fmt.Println(index, slice0[index])
    }
    fmt.Println("\n******元素索引共同使用******")
    for index, value := range slice0 {
        fmt.Println(value, slice0[index])
    }
    fmt.Println("\n******修改******")
    for index := range slice0 {
        slice0[index] = "9"
    }
    fmt.Println(slice0)
}

###注意:使用 “_” 则表示忽略,因为go语言中,未使用的值会导致编译错误,只有一个元素时,该元素代表索引,在元素遍历中,是不能直接修改,主要是因为值传递,为该切片元素的副本,修改它不会影响原本值,只有修改的是该切片的元素引用的值,才可以修改



本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1961885

相关文章
|
16天前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
22天前
|
测试技术 Go API
Go 切片导致 rand.Shuffle 产生重复数据的原因与解决方案
在 Go 语言开发中,使用切片时由于其底层数据共享特性,可能会引发意想不到的 Bug。本文分析了 `rand.Shuffle` 后切片数据重复的问题,指出原因在于切片是引用类型,直接赋值会导致底层数组共享,进而影响原始数据。解决方案是使用 `append` 进行数据拷贝,确保独立副本,避免 `rand.Shuffle` 影响原始数据。总结强调了切片作为引用类型的特性及正确处理方法,确保代码稳定性和正确性。
115 82
|
3月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
128 67
|
3月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
62 7
|
3月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
150 62
|
4月前
|
Go 索引
go语言遍历数组和切片
go语言遍历数组和切片
32 2
|
4月前
|
Go 索引
Go语言中,遍历数组或切片
在Go语言中,遍历数组或切片
98 6
|
4月前
|
Go
|
4月前
|
存储 Go
|
4月前
|
Java Go 数据处理
go语言使用切片而非数组
【10月更文挑战第18天】
28 1

热门文章

最新文章