go之切片
一、概念
- 关于切片
1、切片是对数组一个连续片段的引用,所以切片是一个引用类型
2、切片是数组一样可以索引,可以通过len函数获取切片的数据长度。(数组也可以通过len获取)
3、切片是一个长度可变的数组
4、切片有容量的概念,这是数组所没有的,go 提供了计算容量的函数cap(),可以计算切片容量。0 <=len(s) <=cap(s)
优点:
因为切片是引用,所以它不需要额外的内存并且比使用数组更有效率,所以在go代码中切片比数组更常用
- 定义
# 方式一
var slice []type
slice = make([]type,slice_len)
// 如:
// var s []int
// s = make([]int,0)
# 方式二
slice := make([]type,slice_len)
// 如:
// s := make([]int,0)
# 方式三
slice := []type{}
// 如
// s := []int{1,2,3}
二、切片的声明方式
- 切片的声明与内存创建
package main
import "fmt"
func main(){
var slice []string
// make(类型,长度,容量。。。)
slice = make([]string,3) // make 内存创建,只用于 切片,map,chan类型
slice[0] = "j"
slice[1] = "m"
slice[2] = "z"
fmt.Println(slice)
}
- 关于make
1、引用类型 可以理解为指针,声明引用类型并不会并不会分配内存。
2、与值类型不同,值类型的变量在声明时会分配内存并存储初始值
3、make 就是用于对引用类型分配内存使用的,并返回类型本身
4、目前make函数只用于 切片,map和chan
三、切片的增删改查
package main
import "fmt"
func main(){
var slice []string
// make(类型,长度,容量。。。)
slice = make([]string,0) // make 内存创建,只用于 切片,map,chan类型
// 增
slice = append(slice,"j")
slice = append(slice,"m","z")
arr := []string{"j","l","y"} // 简短声明切片
slice = append(slice, arr...) // 将切片打撒
fmt.Println(slice) // [j m z j l y]
// 改
// 重新赋值即为改
slice[0] = "j1"
slice[1] = "m2"
slice[2] = "z3"
fmt.Println(slice) // [j1 m2 z3 j l y]
// 查
fmt.Println(slice[3]) // j
fmt.Println(slice[2:4]) // 输入下标2~4直接的数据,包头不包尾,不包含下标4 // [z3 j]
fmt.Println(slice[3:]) // 输出下标3之后的所有数据,包含下标3 // [j l y]
fmt.Println(slice[:3]) // 输出 下标3之前的所有数据,不包含下标3 // [j1 m2 z3]
for index,v := range slice{
fmt.Printf("slice[%d]=%v\n",index,v)
}
/*
slice[0]=j1
slice[1]=m2
slice[2]=z3
slice[3]=j
slice[4]=l
slice[5]=y
*/
// 删
// go 的切片删除是通过append 来实现的
slice1 := []string{}
// 删除slice[3]的数据
slice1 = append(slice1,slice[:3]...) // 包头不包尾,不包含下标3的
slice1 = append(slice1,slice[4:]...)
fmt.Println(slice1) //[j1 m2 z3 l y]
}
四、切片之函数使用
- 引用类型之切片函数使用
package main
import "fmt"
func main() {
var slice []int
// make(类型,长度,容量。。。)
slice = make([]int, 3) // make 内存创建,只用于 切片,map,chan类型
fmt.Println(slice) // [0,0,0]
slice = append(slice, 4)
fmt.Println(slice) // [0,0,0,4]
saveSlice(slice)
fmt.Println(slice)
}
func saveSlice(s []int){
s[0] = 111
}
[0 0 0]
[0 0 0 4]
[111 0 0 4]
- 为什么函数没有返回值,却改变类切片的值
切片是引用类型,你可以理解为指针
切片在传参的过程不是值拷贝的过程
切片传参实际传的是引用
五、切片之拷贝
- 引用的复制
package main
import "fmt"
func main() {
s := []int{1,2,3,4}
var s1 []int
s1 = make([]int,len(s))
s1 = s // 将 s 复制给 s1
/*
s1 := s // 与上面是一样的效果
*/
s[0] = 111
fmt.Println(s1)
}
- 为什么切片s的修改,s1 也发生类变化
1、切片其实本质还是对数组的引用
2、赋值操作其实还是对引用的拷贝
简单点:s1 只是对s引用的拷贝,不是值的拷贝
- 值的拷贝一
package main
import "fmt"
func main() {
s := []int{1,2,3,4}
var s1 []int
s1 = make([]int,len(s))
for index := range s{
s1[index] = s[index]
}
s[0] = 1111
fmt.Println(s1)
}
- 值的拷贝二
package main
import "fmt"
func main() {
s := []int{1,2,3,4}
var s1 []int
s1 = make([]int,0)
s1 = append(s1,s...)
s[0] = 111
fmt.Println(s1)
}
六、切片之copy
- go 内部函数copy
package main
import "fmt"
func main() {
s := []int{1,2,3,4}
s1 := make([]int,len(s))
copy(s1,s)
s[0] = 111
fmt.Println(s1)
}
输出结果
[1 2 3 4]
七、注意
切片的简短声明方式
s := []int{} // var s []int;s = make([]int,0) 一样的
如果喜欢看小说,请到183小说网
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中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
随机推荐
- Style在Android中的继承关系
Style在Android中的继承关系 Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Androi ...
- 三年半Java后端面试鹅厂,三面竟被虐的体无完肤
经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征. 鹅厂 面试职位: go后端开发工程师,接受从Java转语言 都知道鹅厂是cpp的主战场,而以cpp为背 ...
- java关于工作,跳槽之总结
关于工作中: 如何展示自己项目中的亮点,技术或者难点: 总结我的经历和技术倒是可以,但是我做的项目和我会的技术都很平庸,实在找不到亮点怎么办? 如果知道了你没有亮点,也就是知道了你自己欠缺什么,那么下 ...
- 10java内存
java内存 1.栈---存储的是变量(不仅仅只有变量),不会对存储的内容进行赋值,存储的内容使用完成之后会立即进行清除 2.堆---存储的是对象.会对存储的内容进行赋值,存储内容使用完成之后会在某个 ...
- 微智魔盒APP开发程序解析
微智魔盒系统开发找崔经理l88Z.6ZZ685l.微智魔盒app开发.微智魔盒商城开发.微智魔盒软件开发,微智魔盒模式开发,微智魔盒源码开发.微智魔盒开发. @Override publicvoidr ...
- C# MVC ajax上传 文件
用普通的ajax提交表单的时候,不能把文件流传到后端去,所以要用到jquery.form.js jquery.form.js到官网下载或者从这里下载:http://pan.baidu.com/s/1c ...
- c/c++排坑(2) -- c语言中的符号重载
所谓的符号重载就是在不同的上下文环境里有不同的意义.甚至有些关键字也被重载而具有好几种意义,这也是C语言的作用域规则对程序员不那么清晰的主要原因. 本章内容摘自<c专家编程>P37. 大家 ...
- (C/C++学习)8.C++ Lambda
一.生成随机数字 假设我们有一个vector<int>容器,想用100以内的随机数初始化它,其中一个办法是通过generate函数生成,如代码1所示.generate函数接受三个参数,前两 ...
- noip模拟赛 幻灯结界
题目描述59式给你出了一道**题:有n个防御人(守方)还有n个攻击坦克(攻方)每个防御人有护甲a[i],而攻击方每个坦克有火力b[i]如果一个防守方的护甲不小于攻击方的攻击力,就可以防的住然而我们保持 ...
- java中String类型转换为float类型
import java.io.*; public class Demo1{ public static void main(String args[]) { String df="12.2& ...