GO之数组切片

发布时间:2020-07-01 05:48:52 作者:DBAspace
来源:网络 阅读:624
数组的容量和长度是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语言中,未使用的值会导致编译错误,只有一个元素时,该元素代表索引,在元素遍历中,是不能直接修改,主要是因为值传递,为该切片元素的副本,修改它不会影响原本值,只有修改的是该切片的元素引用的值,才可以修改

推荐阅读:
  1. go 的数组和切片
  2. golang碎片整理之 数组与切片

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go

上一篇:docker 轻松搭建es+kibana环境

下一篇:Django的缓存(2)

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》