切片定义

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

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 Slave 触发 oom-killer

    最近经常有收到MySQL实例类似内存不足的报警信息,登陆到服务器上一看发现MySQL 吃掉了99%的内存,God ! 有时候没有及时处理,内核就会自己帮我们重启下MySQL,然后我们就可以看到 dme ...

  2. Ubuntu 12.04下LAMP环境搭建实录

    方法一: 用tasksel可以方便安装dns server, lamp, kubuntu desktop, ubuntu desktop, xubuntu之类的软件包.这个软件在ubuntu serv ...

  3. CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!—-揭秘令牌桶

    概述 春暖花开的时候,大家都开着汽车外出旅游欣赏美丽的风景,却被堵在高速公路上,你是否为此感到痛苦?但如果有一种机制可以评估高速公路上的车流量.控制车流情况,确保进入高速公路的汽车都能在路上安全畅行, ...

  4. 【CF710F】String Set Queries(二进制分组,AC自动机)

    [CF710F]String Set Queries(二进制分组,AC自动机) 题面 洛谷 CF 翻译: 你有一个字符集合\(D\),初始为空, 有三种操作: 往\(D\)中加入一个串:从\(D\)中 ...

  5. 【ARC075F】Mirror

    Description ​ 给定正整数\(D\),求有多少个正整数\(N\),满足\(rev(N)=N+D\). ​ 其中\(rev(N)\)表示将\(N\)的十进制表示翻转来读得到的数(翻转后忽略前 ...

  6. BZOJ3112 [Zjoi2013]防守战线 【单纯形】

    题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...

  7. Fork/Join框架实现原理

    ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责存放程序提交给ForkJoinPool的任务,而ForkJoi ...

  8. JS的异步

    1.异步 程序中现在运行的部分和将来运行的部分之间的关系是异步编程的核心. 多数JavaScript开发者从来没有认真思考过自己程序中的异步到底是如何出现的,以及为什么会出现,也没有探索过处理异步的其 ...

  9. 【agc001d】Arrays and Palindrome

    Portal -->agc001D Description 给你一个\(m\)个数的排列\(A\),这个\(A\)中元素的顺序可以随便调换,\(A\)中的元素的和为\(n\),现在要你构造一个数 ...

  10. supervisor 通过图形界面管理

    编辑 supervisor 配置文件, [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; ip_addr ...