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中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
随机推荐
- iOS 代码片段的添加!
说明.代码片段就是方便快捷输入的片段,类似do -while.switch等这些系统语句,这些系统的语句也是代码片段,快速输入一些常用的代码语句,就可以把这些语句写成代码片段! Example: 我们 ...
- C++11并发编程个人小结
thread_local变量在每个线程第一次执行到时初始化(类似static),并在每个线程各自累加,并在线程结束时释放. std::condition_variable:: wait(std::un ...
- 洛谷P4902乘积
题面链接 洛谷 题意简述 求\(\prod_{i=A}^B\prod_{j=1}^i \lgroup \frac{i}{j} \rgroup ^{\lfloor \frac{i}{j} \rfloor ...
- 【BZOJ1502】【NOI2005】月下柠檬树
Portal 传送门 Solution 显然的是,每一个圆的影子,就是从树上的圆按光线方向平移至地面的圆.至于两个圆之间的连接部分,则是每两个在树上相邻的圆的,对应的影子圆的,公切线围起来的部分,如下 ...
- 20135319zl内核模块编译报告
内核模块编程学习报告 1.编写一个简单的输出信息的模块 源代码: Makefile 编译模块 加载模块 测试模块(dmesg) 卸载模块 Sudo rmmod 1 使用dmesg查看情况 2.输出当前 ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机模板
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- BZOJ 1391 [Ceoi2008]order
1391: [Ceoi2008]order Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完 ...
- supervisor "INFO spawnerr: unknown error making dispatchers for xxx" 错误
查看 supervisor 的配置中,是否有受限的文件路径,如果有,则需要修改对应文件的权限
- Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...