go内建容器-切片
1.基础定义
看到'切片'二字,满脸懵逼。切的啥?用的什么刀法切?得到的切片有什么特点?可以对切片进行什么操作?
先看怎么得到切片,也就是前两个问题。切片的底层是数组,所以切片切的是数组;切的时候采用半开半闭(取左舍右)的刀法,如同其他语言截取操作的规则
//s1、s2、s3就是我们要的切片
var array1 = [...]int{0,1,2,3,4,5,6}
var s1 []int
s1 = array1[0:3]
s2 := array1[3:]
s3 := array1[:4]
我们想得到一个东西不一定非得自己动手做,有很多途径可以得到一个成品,得到一个切片亦是如此
//声明一个切片并赋值
s1 := []int{0,1,2,3,4}
//创建一个长度和容量都是8的切片
s2 := make([]int,8)
//创建一个长度为10,容量为16的切片
s3 := make([]int,10,16)
2.切片的特性
得到切片后,我们就可以研究切片的特性了,来瞅瞅
在底层数组长度内,切片是向后延伸的,但不能向前延伸
一个长度为10的数组arr1,通过切它的2到4后得到一个切片s1,此时s1本身的长度为2(有两个值),s1的底层数组长度却为8(即s1的容量为8),虽然通过下标方式不能访问到s[2-7],但通过切s1的0到8得到的s2是一个切片长度和容量皆为8的切片
var array1 = [...]int{0,1,2,3,4,5,6,7,8,9}
s1 := array1[2:4]
//panic: runtime error: index out of range
//fmt.Println(s1[3])
s2 := s1[0:8]
用切片再切得到新切片时,用's3 := s1[2:]'(省略结束位置)的写法不能得到想要的结果,会得到容量(底层数组长度)正确但没有值的一个切片
//s2容量为4,但没有值,切片长度为0
var array1 = [...]int{0,1,2,3,4,5,6}
s1 := array1[1:3]
s3 := s1[2:]
3.切片操作
golang能操作切片内置函数(位于源码的src/builtin/builtin.go)有创建、打印、追加和复制,没有删除某个元素的操作,但通过追加可以实现删除(删除头、尾元素直接再切一次即可)
复制操作不会引起slice容量的改变,追加操作可能会引起容量变化
s1 := []int{0,1,2,3,4}
s2 := make([]int,8)
s3 := make([]int,10,16)
//复制操作,s2为sou,s1为dst,复制操作返回的值为为sou、dst长度的较小值
copy(s1,s2)
//追加操作,'s2[0:]...'表示s2从0开始到结束,可简写为's2...'
s3 = append(s3,s2[0:]...)
//用追加实现删除,后面的元素覆盖掉想要删除的元素
s2 = append(s2[:4],s2[5:]...)
测试代码
package main
import "fmt"
/*
从数组获得slice
*/
func declareSlice(){
	var array1 = [...]int{0,1,2,3,4,5,6}
	var s1 []int
	s1 = array1[0:3]
	s2 := array1[3:]
	s3 := array1[:4]
	printSlice(s1,s2,s3)
}
/*
slice特性
*/
func sliceTrait(){
	var array1 = [...]int{0,1,2,3,4,5,6,7,8,9}
	s1 := array1[2:4]
	//panic: runtime error: index out of range
	//fmt.Println(s1[3])
	s2 := s1[0:8]
	s3 := s1[0:]
	printSlice(s1,s2,s3)
}
/*
slice操作
*/
func sliceOperation()  {
	s1 := []int{0,1,2,3,4}
	s2 := make([]int,8,10)
	s3 := make([]int,5,32)
	s4 := make([]int,0)
	printSlice(s1,s2,s3)
	fmt.Println("Copying ...")
	n := copy(s2,s1)
	fmt.Println(n)
	copy(s3,s2)
	printSlice(s2,s3)
	fmt.Println("Appending  ...")
	s3 = append(s3,s2[0:]...)
	printSlice(s3)
	fmt.Println("Delete elements ...")
	s2 = append(s2[:4],s2[5:]...)
	printSlice(s2)
	fmt.Println("Test capacity ...")
	for m:=0;m<100;m++ {
		printSlice(s4)
		s4 = append(s4,m+1)
	}
}
func printSlice(s ... []int)  {
	for _,v := range s{
		fmt.Printf("value: %v  length: %d  capacity: %d \n", v,len(v),cap(v))
	}
}
func main() {
	declareSlice()
	sliceTrait()
	sliceOperation()
}
												
											go内建容器-切片的更多相关文章
- go内建容器-Map
		
1.基础定义 golang中的map如同它的函数一样"纯粹",map就是用来存储键值对的容器,别管什么哈希不哈希的(底层已实现),用就行 //创建一个map m := map[st ...
 - go内建容器-字符和字符串操作
		
1.基础定义 在基础语法篇提到过golang的rune相当于其他编程语言的char,其本质是一个int32(四字节),用[]rune来转换一个字符串时,得到的是个解码后的结果,存储在新开辟的[]run ...
 - go内建容器-数组
		
1.基础定义 声明时数组长度在数组成员类型前 语法:var variableName [length]int //基本定义 var array1 [3]int //定义并赋值 var array2 = ...
 - golang内建容器
 - 跟着老猫来搞GO-内建容器Map
		
前期回顾 在上面的文章中,老猫和大家分享了GO语言中比较重要的两种数据结构,一种是数组,另外一种是基于数组的slice.本篇文章想要继续和大家分享剩下的容器以及字符字符串的处理. MAP map的定义 ...
 - [pyhton]python内建方法
		
撸一遍python的内建方法 这样做的好处就是:我如果要完成一个功能的时候,如果能用内建方法完成,就用内建方法.这样可以提高效率,同时使自己的代码更加优雅.哎呦?那岂不是撸完就是python高手了?我 ...
 - python高级编程之(类级):子类内建类型
		
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一( ...
 - python之3内置容器
		
所谓内置容器,就是不需要第三方模块,就可以使用的. 1.list容器,一个有序序列,类似于数组,但比数组强大很多 1.1.如何初始化list,直接一个[]即可,这是一个空的list >>& ...
 - IIS7内建账号,应用程序池
		
在IIS7以前的IIS版本中有一个本地帐号,是在安装时创建的,叫做 IUSR_MachineName.一旦启用匿名身份认证,这个IUSR_MachineName帐号就是IIS默认使用的身份(ident ...
 
随机推荐
- C++的extern关键字
			
extern是一个声明,不是一个定义,A模块想应用B模块的一个函数或者变量,A模块包含B模块的头文件,并且在变量或者头文件前,加 extern,虽然编译的时候,找不到模块的定义,但是在连接的时候,会在 ...
 - Jquery学习---Easy UI 框架
			
Jquery的easyui 1.1. easyui的目录分析 以 jquery Easy UI 1.3.2 版本学习 demo 实例 locale 国际化信息 plugins 框架一些插件 src 源 ...
 - 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
			
编译错误和编译警告 MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告. 而格式只是简简单单的 error: 开头或者 warning: 开头.冒号 ...
 - [原]Linux 命令行 发送邮件
			
1.mail -s hi xx@yy.com 给xx@yy.com发一封主题为hi的信(没有正文) 编辑完内容后Ctrl-D结束. 2.echo "This is a test mail!& ...
 - hibernate 映射 数据库number 映射为 double 为空 报错问题
			
将 数据库表 映射成hibernate 实体类时 将number --- double 如果数据库中number 为空,查找数据时将报错 Can not set double field ***** ...
 - codeforces 814E An unavoidable detour for home
			
题目链接 正解:$dp$. 感觉这道题就是中国象棋的加强版..我们要发现一些性质. 首先就是这个图肯定是一个按照$bfs$序分层的图,且每个点只往自己上面那一层连了一条边,每个点不可能向自己的上面超过 ...
 - datetime.datetime.now()时间格式转化是碰到的问题
			
import datetime print datetime.datetime.now() # 2016-03-28 17:16:00.812000 a = ‘2016-03-28 17:16:00. ...
 - mxnet导入图像数据
			
图像的标签在一个json文件中. %matplotlib inline import json import gluonbook as gb import mxnet as mx from mxnet ...
 - C++中rapidxml用法及例子(源码)
			
rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml, ...
 - sqoop 1.99.7 安装及配置
			
一 下载sqoop 1.99.7 http://mirror.bit.edu.cn/apache/sqoop/1.99.7/ 二 解压安装文件 三 配置Sqoop 环境变量 最后把mysql的驱动j ...