Go中的数组切片的使用总结
代码示例
package main
import "fmt"
func main(){
fmt.Println("Hello, world")
// 定义数组的常规方法
/******************************
[32]byte // 长度为32的数组
[2 * N] struct {x, y int32} // 复杂类型数组
[100]*float32 // 指针数组
[2][3]int // 二维数组
[2][2][2] float64 // 等同于[2] ([2] ([2] float64))
******************************/
array := [5]int{1,2,3,4,5}
// 遍历数组
fmt.Println("Traverse func 1 --->")
for i:= 0; i < len(array); i++ {
fmt.Printf("%d\t",array[i])
}
fmt.Println()
for i, v := range array {
fmt.Printf("index %d is %d\n", i, v)
}
// try to use modify func to modify array
// cannot success, value type
modifyArray(array)
fmt.Println("In main func(), array values -->", array)
// use slice
useSlice()
}
// 数组是值类型
func modifyArray(array [5]int){
array[0] = 12
fmt.Println("In Modify func(), array values -->", array)
}
// 数组切片的结构定义
// 一个指向原生数组的指针
// 数据切片的元素个数
// 数组切片已分配的存储空间
func useSlice(){
// 1. 创建数组切片
// 基于数组
var myArr [3]int32 = [3]int32{23,1,3}
// myArray[first:last]
var mySlice []int32 = myArr[:]
fmt.Println("Elements of myArr is")
for _, v := range myArr {
fmt.Printf("%d\t", v)
}
fmt.Println()
fmt.Println("\nElement of mySlice is ")
for _, v := range mySlice {
fmt.Printf("%d\t", v)
}
fmt.Println()
// 2. 直接创建
fmt.Println("直接创建数组切片")
// 创建一初始元素个数为5,初始值为0,预留10个元素的存储空间的slice
mySliceOne := make([]int, 5, 10)
fmt.Println("\nmySliceOne is ", mySliceOne)
// 创建并且初始化包含5个元素的数组切片
mySliceTwo := []int{1,2,3,43,23}
fmt.Println("\nmySliceTwo is ", mySliceTwo)
// 3. 遍历数组切片
for _, v := range mySliceTwo {
fmt.Printf("%d\t", v)
}
// 4. 动态增减元素
// go语言内置cap和len两个函数
// cap返回的是数组切片的分配的空间大小,len返回的屙屎数组切片中当前所存储的元素个数
myNewSlice := make([]int, 5, 10)
fmt.Println("myNewSlice is ", myNewSlice)
fmt.Println("len(myNewSlice) is ", len(myNewSlice))
fmt.Println("cap(myNewSlice) is ",cap(myNewSlice))
// 5. 如果需要继续在myNewSlice中添加3个元素,使用append方法
myNewSlice = append(myNewSlice, 12, 12 , 23)
fmt.Println("after append 5 elements in slice, results is ", myNewSlice)
// append后面的参数其实是不定参数, 也可以直接将一个slice添加到一个slice中,只是写法会有些不一样
subSlice := []int{12,2,1}
// 注意第二个参数后面的三个点
// 数组切片会自动处理内存空间不足的问题,如果内存不够,就会自动分配一块够大的空间
myNewSlice = append(myNewSlice, subSlice...)
fmt.Println("after append other slice in slice, results is ", myNewSlice)
// 6. 基于数组切片创建数组切片
oldSlice := []int{12,23,12}
newSlice := oldSlice[1:2]
fmt.Println("newSlice is ", newSlice)
// 7. 内容复制
// copy内置函数,如果两个数组切片不一样大,则按照其中个数少的那个进行复制
s1 := []int{1,2,34,4,5,6}
s2 := []int{4,21,1}
// 只复制s1的前3个元素到s2中
fmt.Println("\ns2 is ", s2)
copy(s2, s1)
fmt.Println("copy elements of s1 to s2 is ", s2)
// 只复制s2的3个元素到s2的前3个元素中
fmt.Println("\ns1 is ", s1)
copy(s1, s2)
fmt.Println("copy elements of s2 to s1 is ", s1)
}
输出结果
Hello, world
Traverse func 1 --->
1 2 3 4 5
index 0 is 1
index 1 is 2
index 2 is 3
index 3 is 4
index 4 is 5
In Modify func(), array values --> [12 2 3 4 5]
In main func(), array values --> [1 2 3 4 5]
Elements of myArr is
23 1 3
Element of mySlice is
23 1 3
直接创建数组切片
mySliceOne is [0 0 0 0 0]
mySliceTwo is [1 2 3 43 23]
1 2 3 43 23 myNewSlice is [0 0 0 0 0]
len(myNewSlice) is 5
cap(myNewSlice) is 10
after append 5 elements in slice, results is [0 0 0 0 0 12 12 23]
after append other slice in slice, results is [0 0 0 0 0 12 12 23 12 2 1]
newSlice is [23]
s2 is [4 21 1]
copy elements of s1 to s2 is [1 2 34]
s1 is [1 2 34 4 5 6]
copy elements of s2 to s1 is [1 2 34 4 5 6]
Go中的数组切片的使用总结的更多相关文章
- go语言中的数组切片:特立独行的可变数组
go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...
- GO中的数组切片
GO中的数组切片可以看做是功能更强大的数组,在append数据时,可以自动调整内存大小以适应数据实际大小,有些类似于C#中的List<T>. GO 中数组切片的“容量”与实际储存的大小可以 ...
- Python中ndarray数组切片问题a[-n -x:-y]
先看看如下代码: >>a=np.arange(10)>>a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>a[-7:] array( ...
- Go语言中的数组与数组切片
Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [in ...
- Go语言中底层数组和切片的关系以及数组扩容规则
Go语言中底层数组和切片的关系以及数组扩容规则 demo package main import ( "fmt" ) func main() { // 声明一个底层数组,长度为10 ...
- golang中不定参数与数组切片的区别
package main import "fmt" func main() { myfunc1(, , , ) //传递不定数量的参数 myfunc2([], , , }) //传 ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
- go语言 类型:数组切片
初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针.数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针: 2.数组切片中的元素个数: 3.数组切 ...
- Shell中的数组及其相关操作
http://blog.csdn.net/jerry_1126/article/details/52027539 Shell中数据类型不多,比如说字符串,数字类型,数组.数组是其中比较重要的一种,其重 ...
随机推荐
- mysql 主键和默认 设为索引的规则
一.mysql 表中如果是单主键的话,那这个主键也会被 系统默认建为 索引 二.mysql 表中如果是复合主键的话,那系统会遵循左对齐原则,即如复合主键 a 和 b字段和c字段..., 默认建的主键索 ...
- Tomorrow - 地形生成(1)
原理很简单,请不要喷. 效果展示 种子输入框 种子为12345的地形 种子为23456的地形 代码展示 globalvar map random_set_seed(real(get_string ...
- python填写问卷星,疫情上报
#!!!注意:修改main里的url为真实的url,按需修改 50行 set_data中的submitdata # 61行 ip 修改为 真ip # submittype可能有错误,在151行 # 提 ...
- E1. Send Boxes to Alice (Easy Version)
题解: 保存每个1的位置.然后记录1的总个数cnt,如果存在一个k使得这个k是每个集合的倍数,那么为了使操作次数最小,这个k应该是cnt的质因子.(因为都是每个集合的数目1,使每个集合的数目变为2需要 ...
- JMeter在Mac下的安装
其实不论操作系统是Windows.Unix(如Mac OS).Linux(如Ubuntu)等,JMeter所需要的基础环境配置都是类似的,本文介绍JMeter for MAC的安装与环境配置. JMe ...
- Golang Web入门(3):如何优雅的设计中间件
摘要 在上一篇文章中,我们已经可以实现一个性能较高,且支持RESTful风格的路由了.但是,在Web应用的开发中,我们还需要一些可以被扩展的功能. 因此,在设计框架的过程中,应该留出可以扩展的空间,比 ...
- SpringBoot全局异常处理与定制404页面
一.错误处理原理分析 使用SpringBoot创建的web项目中,当我们请求的页面不存在(http状态码为404),或者器发生异常(http状态码一般为500)时,SpringBoot就会给我们返回错 ...
- Git 创建远程仓库并克隆到本地,创建本地仓库并推送到远程仓库
配置用户信息 配置的是你个人的用户名称和电子邮件地址.这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,会随更新内容一起被永久纳入历史记录 git config --glo ...
- 干货福利:如何使用Python中Django模板?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 穆胜亮 篇文章将学习如何使用Django模板.模板是在Django ...
- Selenium常见报错问题(1)- 先来认识下selenium常见异常类
如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...