切片定义

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

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. MySQL 测试工具(基准测试、压力测试)

    1.sysbench sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库: 主要包括以下几种测试: cpu性能 磁盘io性能 调度程序性能 内存分配及传输速度 POSIX线程性能 数据 ...

  2. Executors提供的四种线程池和自定义线程池

    JAVA并发编程——EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象 ...

  3. BeautifulSoup的find()和findAll()

    BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的).借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签. 首先find ...

  4. IBatisNet 缓存使用

    参考:http://www.cnblogs.com/xiaogangqq123/archive/2011/06/30/2094905.html <?xml version="1.0&q ...

  5. MT【137】多少个?

    数列\(\{a_n\}\)共11项,\(a_1=0,a_{11}=4\),且\(|a_{k+1}-a_{k}|=2,k=1,2,\cdots,10\) 求满足条件的不同的数列的个数______ 解答: ...

  6. 【BZOJ1045】糖果传递(贪心)

    [BZOJ1045]糖果传递(贪心) 题面 BZOJ 洛谷 题解 秉承者娱乐精神,我们必须写一个费用流,并且相信信仰跑不过去. 于是写了一个\(zkw\)费用流如下:(您可以无视此份代码) #incl ...

  7. java插件之Lombok

    使用注释来减少Java中的重复代码 @NonNull - 或者:我怎么学会停止担心和喜欢上了NullPointerException. @Cleanup - 自动资源管理:安全地调用您的close() ...

  8. git<commit和分支>

    commit: 在执行提交命令git commit之前,一定要git add要修改的文件,这样才能将更改的内容更新到本地. 在Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内 ...

  9. 并发批量管理500台以上服务器脚本分享(shell版)

    转载于运维笔记 Categories:Shell 也许很多人认为shell不能并发任务,其实可通过其它一些方式来实现.下面的脚本是我批量快速管理500+服务器脚本,阅读该脚本前建议先看<自动执行 ...

  10. 为什么 “return s and s.strip()” 在用 filter 去掉空白字符时好使?

    如题: 给定一个数组,其中该数组中的每个元素都为字符串,删除该数组中的空白字符串. _list = ["A", "", "", " ...