切片定义

切片是基于数组类型做的一层封装。它非常灵活,可以自动扩容。

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 切片的更多相关文章

  1. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  2. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  3. 充电时间 Go中的数组、切片、map简单示例

    数组是固定长度的,依稀让我想起了VB:切片是动态的:map一般是键值对 package main import ( "fmt" ) func main() { var userna ...

  4. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  5. [LeetCode] Arithmetic Slices 算数切片

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  6. 网络切片在5G中的应用

    SDNLAB君 • 16-11-25 •1509 人围观 5G和网络切片 当5G被广泛提及的时候,网络切片是其中讨论最多的技术.像KT.SK Telecom.China Mobile.DT.KDDI. ...

  7. KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  8. 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  9. 使用KRPano资源分析工具一键下载全景网站切片图

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  10. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...

随机推荐

  1. ZooKeeper-基础介绍

    What is ZooKeeper? ZooKeeper为分布式应用设计的高性能(使用在大的分布式系统).高可用(防止单点失败).严格地有序访问(客户端可以实现复杂的同步原语)的协同服务. ZooKe ...

  2. P2261 [CQOI2007]余数求和

    我是题面 题意还是很清晰,很容易理解 1e9范围明显不能暴力,除非你能把常数优化到\(\frac1 {10}\),但我实在想象不到用了这么多取模怎么把常数优化下去 我们可以把\(k\%i\)变成\(k ...

  3. vyatta的fork开源版本vyos

    vyatta的fork开源版本vyos 来源: https://www.reddit.com/r/networking/comments/3dvwfy/who_here_is_using_vyos/ ...

  4. 【ARC068F】Solitaire

    Description ​ 你有一个双端队列和 \(N\) 个数字,先按 \(1\) 到 \(N\) 的顺序每次从任意一端插入当前数字,再进行 \(N\) 次操作每次可以从两端弹出,求有多少种弹出序列 ...

  5. linux内核分析 第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程

    笔记: 实验:使用gdb跟踪分析一个schedule()函数

  6. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  7. LGP4588[JSOI2018]扫地机器人

    题解 需要先说明一点东西: 1 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环:: 如果左上方是$(1,1)$,容易看出所有的路径是从左或 ...

  8. 梯度提升树GBDT算法

    转自https://zhuanlan.zhihu.com/p/29802325 本文对Boosting家族中一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 简 ...

  9. 【Asp.net入门09】第一个ASP.NET 应用程序-处理窗体(1)

    我们创建了一个HTML窗体,可以通过它显示受邀参加晚会的嘉宾,但是,当嘉宾单击Submit RSVP按钮时,同一个页面会反复多次显示.为了解决此问题,需要实现一段代码,用于在将窗体数据发布到服务器时执 ...

  10. Docker Swarm高可用性

    一.前言 在Docker Swarm集群中,Swarm manager负责管理整个集群,如果管理节点manager出现故障,虽然不会影响现有的服务和工作节点,但是我们不能继续管理我们的docker s ...