go 切片
切片定义
切片是基于数组类型做的一层封装。它非常灵活,可以自动扩容。
- var a []int
- //定义一个int类型的空切片
切片初始化, a[start:end]创建一个包括从start到end-1的切片。
- package main
- import (
- "fmt"
- )
- func main() {
- a := []int{, , , , }
- var b []int = a[:] //基于数组a创建⼀个切⽚,包括元素a[1] a[2] a[3]
- fmt.Println(b)
- }
切片初始化方法2
- package main
- import (
- "fmt"
- )
- func main() {
- c := []int{, , } //创建⼀个数组并返回⼀个切⽚
- fmt.Println(c)
- }
数组切片的基本操作
切片基本操作
a) arr[start:end]:包括start到end-1(包括end-1)之间的所有元素
b) arr[start:]:包括start到arr最后一个元素(包括最后一个元素)之间的所有元素
c) arr[:end]:包括0到end-1(包括end-1)之间的所有元素
d) arr[:]:包括整个数组的所有元素
- package main
- import (
- "fmt"
- )
- func testSlice0() {
- var a []int
- if a == nil {
- fmt.Printf("a is nil\n")
- } else {
- fmt.Printf("a = %v\n", a)
- }
- a[] =
- }
- func testSlice1() {
- a := []int{, , , , }
- var b []int
- b = a[:]
- fmt.Printf("slice b:%v\n", b)
- fmt.Printf("b[0]=%d\n", b[])
- fmt.Printf("b[1]=%d\n", b[])
- fmt.Printf("b[2]=%d\n", b[])
- fmt.Printf("b[3]=%d\n", b[])
- }
- func testSlice2() {
- a := []int{, , , , }
- fmt.Printf("slice a:%v type of a:%T\n", a, a)
- }
- func testSlice3() {
- a := []int{, , , , }
- var b []int
- b = a[:]
- fmt.Printf("slice b:%v\n", b)
- // c := a[1:len(a)]
- c := a[:]
- fmt.Printf("slice c:%v\n", c)
- //d := a[0:3]
- d := a[:]
- fmt.Printf("slice d:%v\n", d)
- // e := a[0:len(a)]
- e := a[:]
- fmt.Printf("slice e:%v\n", e)
- }
- func testSlice4() {
- a := [...]int{, , , , , , , , }
- fmt.Printf("array a:%v type of a:%T\n", a, a)
- b := a[:]
- fmt.Printf("slice b:%v type of b:%T\n", b, b)
- /*
- b[0] = b[0] + 10
- b[1] = b[1] + 20
- b[2] = b[2] + 30
- */
- /*
- for index, val := range b {
- fmt.Printf("b[%d]=%d\n", index, val)
- }
- */
- for index := range b {
- b[index] = b[index] +
- }
- fmt.Printf("after modify slice b, array a:%v type of a:%T\n", a, a)
- }
- func testSlice5() {
- a := [...]int{, , }
- s1 := a[:]
- s2 := a[:]
- s1[] =
- fmt.Printf("a=%v s2=%v\n", a, s2)
- s2[] =
- fmt.Printf("a=%v s1=%v\n", a, s1)
- }
- func main() {
- //testSlice0()
- //testSlice1()
- //testSlice2()
- //testSlice3()
- //testSlice4()
- testSlice5()
- }
test
切片修改
- package main
- import (
- "fmt"
- )
- func main() {
- //创建一个数组,其中[…]是编译器确定数组的⻓度,darr的长度是9
- darr := [...]int{, , , , , , , , }
- //基于darr创建一个切片dslice,包括darr[2],darr[3],darr[4]三个元素
- dslice := darr[:]
- fmt.Println("array before",darr)
- for i := range dslice {
- //对于dslice中每个元素进行+1,其实修改是darr[2],darr[3],darr[4]
- dslice[i]++
- }
- fmt.Println("array after",darr)
- }
- package main
- import (
- "fmt"
- )
- func main() {
- numa := []int{, ,}
- //创建一个切片,包含整个数组的所有元素
- nums1 := numa[:]
- nums2 := numa[:]
- fmt.Println("array before change 1",numa)
- nums1[] =
- fmt.Println("array after modification to slice nums1", numa)
- nums2[] =
- fmt.Println("array after modification to slice nums2", numa)
- }
使用make创建切片
- package main
- import (
- "fmt"
- )
- func main() {
- //[]中没有长度
- i := make([]int, , )
- fmt.Println(i)
- }
切片的长度和容量
- package main
- import (
- "fmt"
- )
- func main() {
- fruitarray := […]string{
- "apple", "orange", "grape",
- "mango", "water melon",
- "pine apple", "chikoo"}
- fruitslice := fruitarray[:]
- //长度是2,容量is 6
- fmt.Printf("length of slice %d capacity %d",
- len(fruitslice), cap(fruitslice))
- }
- package main
- import "fmt"
- func testMake1() {
- var a []int
- a = make([]int, , )
- a[] =
- //a[1] = 20
- fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
- a = append(a, )
- fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
- for i := ; i < ; i++ {
- a = append(a, i)
- fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
- }
- //观察切片的扩容操作,扩容的策略是翻倍扩容
- a = append(a, )
- fmt.Printf("扩容之后的地址:a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
- }
- /*
- a=[10 0 0 0 0] addr:0xc0000860a0 len:5 cap:10
- a=[10 0 0 0 0 11] addr:0xc0000860a0 len:6 cap:10
- a=[10 0 0 0 0 11 0] addr:0xc0000860a0 len:7 cap:10
- a=[10 0 0 0 0 11 0 1] addr:0xc0000860a0 len:8 cap:10
- a=[10 0 0 0 0 11 0 1 2] addr:0xc0000860a0 len:9 cap:10
- a=[10 0 0 0 0 11 0 1 2 3] addr:0xc0000860a0 len:10 cap:10
- a=[10 0 0 0 0 11 0 1 2 3 4] addr:0xc000098000 len:11 cap:20
- a=[10 0 0 0 0 11 0 1 2 3 4 5] addr:0xc000098000 len:12 cap:20
- a=[10 0 0 0 0 11 0 1 2 3 4 5 6] addr:0xc000098000 len:13 cap:20
- a=[10 0 0 0 0 11 0 1 2 3 4 5 6 7] addr:0xc000098000 len:14 cap:20
- 扩容之后的地址:a=[10 0 0 0 0 11 0 1 2 3 4 5 6 7 1000] addr:0xc000098000 len:15 cap:20
- */
- func testMake2() {
- var a []int
- a = make([]int, , )
- //a[5] = 100
- a = append(a, )
- fmt.Printf("a=%v\n", a)
- b := make([]int, , )
- fmt.Printf("b=%v len:%d cap:%d\n", b, len(b), cap(b))
- b = append(b, )
- fmt.Printf("b=%v len:%d cap:%d\n", b, len(b), cap(b))
- }
- func main() {
- // testMake1()
- testMake2()
- }
切片的再切片
- package main
- import "fmt"
- func reslice() {
- a := [...]int{, , , , , , , , }
- b := a[:]
- fmt.Printf("b = %d len(b) = %d cap(b)=%d\n", b, len(b), cap(b))
- c := b[:cap(b)]
- fmt.Printf("c = %d len(c) = %d cap(c)=%d\n", c, len(c), cap(c))
- }
- func main() {
- reslice()
- }
- /*
- b = [3 4] len(b) = 2 cap(b)=7
- c = [3 4 5 6 4 7 8] len(c) = 7 cap(c)=7
- */
计算容量
- package main
- import "fmt"
- func testCap() {
- a := [...]int{, , , , , , }
- b := a[:]
- fmt.Print("b= %v len(b) = %d, cap(b) = %d\n", b, len(b), cap(b)) // 切片的容量 等于 原始素组的长度 减去 切片开始的索引
- }
- func main() {
- testCap()
- }
- package main
- import (
- "fmt"
- )
- func main() {
- fruitarray := […]string{
- "apple", "orange", "grape", "mango",
- "water melon", "pine apple", "chikoo"}
- fruitslice := fruitarray[:]
- //⻓度是2, 容量是6
- fmt.Printf("length of slice %d capacity %d\n",
- len(fruitslice), cap(fruitslice))
- //再重新进⾏切⽚,不能⼤于数组fruitarray的⻓度,否则越界
- fruitslice = fruitslice[:cap(fruitslice)]
- fmt.Println("After re-slicing length is”,
- len(fruitslice), "and capacity is",cap(fruitslice))
- }
append操作
- package main
- import (
- "fmt"
- )
- func main() {
- cars := []string{"Ferrari", "Honda", "Ford"}
- //长度和容量都等于3
- fmt.Println("cars:", cars, "has old length", len(cars), "and capacity", cap(cars))
- cars = append(cars, "Toyota")
- //容量等于6
- fmt.Println("cars:", cars, "has new length",
- len(cars), "and capacity", cap(cars))
- }
- /*
- cars: [Ferrari Honda Ford] has old length 3 and capacity 3
- cars: [Ferrari Honda Ford Toyota] has new length 4 and capacity 6
- */
空切片
- package main
- import (
- "fmt"
- )
- func main() {
- //定义names是一个空切片,长度和容量都等于0
- //不能对空切片进行访问,否则panic
- var names []string
- if names == nil {
- fmt.Println("slice is nil going to append")
- names = append(names, "John", "Sebastian", "Vinay")
- fmt.Println("names contents:",names)
- }
- }
- package main
- import "fmt"
- func test() {
- var a []int
- fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
- // a[0]=100 报错
- if a == nil {
- fmt.Printf("a is nil\n")
- }
- a = append(a, )
- fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
- a = append(a, )
- fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
- a = append(a, )
- fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
- a = append(a, )
- fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
- }
- /*
- addr = 0x0 len=0 cap =0
- a is nil
- addr = 0xc0000100e0 len=1 cap =1
- addr = 0xc000010100 len=2 cap =2
- addr = 0xc00000a3c0 len=3 cap =4
- addr = 0xc00000a3c0 len=4 cap =4
- */
- func main() {
- test()
- }
append一个切片
- package main
- import (
- "fmt"
- )
- func main() {
- veggies := []string{"potatoes","tomatoes","brinjal"}
- fruits := []string{"oranges","apples"}
- //fruits后面的3个点表示展开fruits切片成一个个元素
- food := append(veggies, fruits...)
- fmt.Println("food:",food)
- }
- // food: [potatoes tomatoes brinjal oranges apples]
- package main
- import "fmt"
- func test() {
- var a []int = []int{, , }
- b := []int{, , }
- c := append(a, b...)
- fmt.Printf("a=%v\n", a)
- fmt.Printf("b=%v\n", b)
- fmt.Printf("c=%v\n", c)
- }
- /*
- a=[1 2 3]
- b=[4 5 6]
- c=[1 2 3 4 5 6]
- */
- func main() {
- test()
- }
切片传参
- package main
- import (
- "fmt"
- )
- //在函数内部修改numbers切⽚的值
- func subtactOne(numbers []int) {
- for i := range numbers {
- numbers[i] -=
- }
- }
- func main() {
- nos := []int{, , }
- fmt.Println("slice before function call", nos)
- subtactOne(nos)
- //nos修改生效了,说明切片是引用类型
- fmt.Println("slice after function call", nos)
- }
- /*
- slice before function call [8 7 6]
- slice after function call [6 5 4]
- */
- package main
- import "fmt"
- func testSum(a []int) int {
- sum :=
- for _, v := range a {
- sum += v
- }
- return sum
- }
- func testChange(a []int) {
- a[] =
- }
- func main() {
- a := [...]int{, , , , , }
- // sum := testSum(a[:])
- // fmt.Printf("sum = %d", sum) //
- fmt.Printf("a=%v\n", a)
- testChange(a[:])
- fmt.Printf("a=%v", a)
- /*
- a=[1 2 3 4 5 6]
- a=[1000 2 3 4 5 6]
- */
- }
切片拷贝
- package main
- import (
- "fmt"
- )
- func main() {
- veggies := []string{"potatoes", "tomatoes", "brinjal"}
- fruits := []string{"oranges", "apples"}
- copy(veggies, fruits)
- fmt.Println(veggies, fruits) //[oranges apples brinjal] [oranges apples]
- }
- package main
- import "fmt"
- func testCopy() {
- a := []int{, , }
- b := []int{, , }
- copy(a, b)
- fmt.Printf("a = %v\n", a) // [4,5,6]
- fmt.Printf("b = %v\n", b) // [4,5,6]
- c := []int{, }
- d := []int{, , }
- e := copy(c, d)
- fmt.Printf("c = %v\n", c) // [4,5]
- fmt.Printf("d = %v\n", d) // [4,5,6]
- fmt.Printf("e = %v\n", e) //
- b[] =
- fmt.Printf("a = %v\n", a) // [4,5,6]
- fmt.Printf("b = %v\n", b) // [100 5 6]
- aa := [...]int{, , , , , }
- bb := aa[:]
- cc := []int{, , }
- copy(bb, cc)
- fmt.Printf("aa = %v\n", aa) // [10 20 30 4 5 6]
- fmt.Printf("bb = %v\n", bb) // [10 20 30 4 5 6]
- fmt.Printf("cc = %v\n", cc) // [10 20 30]
- }
- func main() {
- testCopy()
- }
切片遍历
- var a []int
- a[] =
- a[] =
- a[] =
- b := a[:]
- for index, val := range b {
- }
- //和数组遍历一样
make和new区别
make为内建类型slice、map和channel分配内存。
- //初始化一个切片
- s := make([]int, , )
new用于各种类型的内存分配,new返回是一个指针。
go 切片的更多相关文章
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片
概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...
- 充电时间 Go中的数组、切片、map简单示例
数组是固定长度的,依稀让我想起了VB:切片是动态的:map一般是键值对 package main import ( "fmt" ) func main() { var userna ...
- GO语言总结(3)——数组和切片
上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...
- [LeetCode] Arithmetic Slices 算数切片
A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...
- 网络切片在5G中的应用
SDNLAB君 • 16-11-25 •1509 人围观 5G和网络切片 当5G被广泛提及的时候,网络切片是其中讨论最多的技术.像KT.SK Telecom.China Mobile.DT.KDDI. ...
- KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 使用KRPano资源分析工具一键下载全景网站切片图
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
随机推荐
- 当给属性添加final 时候 则无法进行第二次值的修改
- 题解 CF762A 【k-th divisor】
emmm...不能说是水题吧...小金羊以为考的是STL(手动滑稽)... 行,这个题说让分解因数(不一定非得质因数). 我们考虑到有第k个数有可能有\(x\cdot x=n\)的毒瘤情况, 并且题目 ...
- c++11 右尖括号>改进
c++11 右尖括号>改进 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...
- python 求两个时间差
def timeInterval(self): today = datetime.date.today() print today modifiedTime = os.stat(filename).s ...
- 【bzoj2034】 2009国家集训队—最大收益
http://www.lydsy.com/JudgeOnline/problem.php?id=2034 (题目链接) 题意 n个任务,每个任务只需要一个时刻就可以完成,完成后获得${W_i}$的收益 ...
- LGP4588[JSOI2018]扫地机器人
题解 需要先说明一点东西: 1 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环:: 如果左上方是$(1,1)$,容易看出所有的路径是从左或 ...
- jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年
http://blog.csdn.net/wangjingjing1014/article/details/16885341 <head><meta http-equiv=" ...
- 图像bayer格式介绍以及bayer插值原理CFA
1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像. 对于彩色图像,需要采集多种最基本的颜色, ...
- sqlalchemy常用语法
一.新增数据 # 新增一条数据 user_obj = User(name="bigberg", passwd="twgdh123") Session.add(u ...
- Hadoop生态圈-hbase介绍-完全分布式搭建
Hadoop生态圈-hbase介绍-完全分布式搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.