为了账号安全,请及时绑定邮箱和手机立即绑定

GO之数组切片

标签:
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语言中,未使用的值会导致编译错误,只有一个元素时,该元素代表索引,在元素遍历中,是不能直接修改,主要是因为值传递,为该切片元素的副本,修改它不会影响原本值,只有修改的是该切片的元素引用的值,才可以修改

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消