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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:GO之数组切片-创新互联
本文URL:http://hbruida.cn/article/icpph.html