数组Array
 定义数组的格式:var <varName>[n]<type>,n>0
 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型,
 不同类型的不能相互赋值
 注意区分指向数组的指针和指针数组
 数组在GO中为值类型
 数组之间(相同类型)可使用==或!=进行比较,但不可以使用>或<
 可以使用new来创建数组,此方法返回一个指向数组的指针
 go支持多维数组

func main() {
a:=[] int{:,:}
b:=[...] int {:,:,:}
var c [] int= [] int {,}
fmt.Println(a) //[0 3 1]
fmt.Println(b) //[0 1 2 0 0 5]
fmt.Println(c)//[1 3]
}
func main() {
var c [] int= [] int {,}
var p *[] int=&c
fmt.Println(p) //指向数组的指针 &[1 3]
x,y:=,
a:=[] * int{&x,&y}
fmt.Println(a) //[0xc0820022a0 0xc0820022a8] 指针数组
}
func main() {
a:=[] int{}
a[]=
fmt.Println(a) //[0 2 0 0 0 0 0 0 0 0]
p:=new([] int)
p[]=
fmt.Println(p) //&[0 2 0 0 0 0 0 0 0 0]
}

Go多维数组

func main() {
a := [][]int{
{, , },
{, , }}
fmt.Println(a)
}

go语言版冒泡排序

func main() {
arr:=[...]int{,,,,}
fmt.Println(arr)
len:=len(arr)
count:= //交换次数
for i:=;i<len;i++{
for j:=i+;j<len;j++{
if arr[i]>arr[j]{
tmp:=arr[j]
arr[j]=arr[i]
arr[i]=tmp
count++
}
}
}
fmt.Println(arr)
fmt.Println(count) //
}
循环里可以
func main() {
for i:=;i<;i++{
v:=
fmt.Println(&v) //每次一个新地址
}
}
在循环外
v:=
v:=
是错误的

切片Slice
  本身并不是数组,它指向底层的数组
  作为变长数组的替代方案,可以关联底层数组的局部或全部
  为引用类型
  可以直接创建或者从底层数组获取生成
  使用len()获取元素个数,cap()获取容量
 一般使用make()创建
 如果多个slice指向相同底层数组,其中一个值改变会影响全部

  make([]type ,len,cap)
 其中cap可以省略,省略时和len值相同
  len表示存储的个数,cap表示容量

func main() {
var s [] int=[]int{,,,,,,,,,}
fmt.Println(s)
// s1:=s[5:10] //前闭后开 索引包含5不包含10,从索引5取到最后3种形式
// s1:=s[5:len(s)]
s1:=s[:]
s2:=s[:]
fmt.Println(s1) //[6 7 8 9 10]
fmt.Println(s2)//[1 2 3 4 5]
}
func main() {
s1:=make([]int,,)
fmt.Println(len(s1),cap(s1))//3 10
fmt.Println(s1)//[0 0 0]
}

Reslice
Reslice时索引以被slice的切片为准
索引不可以超过被slice切片的容量的cap()值 //超出内存块了
索引越界不会导致底层数组的重新分配而是引发错误

func main() {
a:=[]string{"a","b","c","d","e","f","g","h","i","j"}
s1:=a[:]
fmt.Println(s1)//[c d e]
fmt.Println(len(s1),cap(s1))//3 8 指向的是1个连续的内存块
s2:=s1[:]
fmt.Println(s2)//[c d]
fmt.Println(len(s2),cap(s2))//2 8
s3:=s2[:]
fmt.Println(s3)//[d]
fmt.Println(len(s3),cap(s3))//1 7
}

Append
可以在slice尾部追加元素
可将一个slice追加在另一个slice的尾部
如果最终长度未超过追加到slice的容量则返回原始slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据

unc main() {
s1:=make([]int,,)
fmt.Printf("%p\r\n",s1)//0xc082005da0
s1=append(s1,,,)
fmt.Printf("%v,%p\r\n",s1,s1)//[0 0 0 1 2 3],0xc082005da0
s1=append(s1,,,)
fmt.Printf("%v,%p",s1,s1)//[0 0 0 1 2 3 4 5 6],0xc08203a120(地址变了,重新分配了)
}
func main() {
a:=[]int{,,,,}
s1:=a[:] //[3 4 5]
s2:=a[:] //[2 3]
fmt.Println(s1,s2)
s1[]=
fmt.Println(s1,s2,a)//[9 4 5] [2 9] [1 2 9 4 5]
a[]=
fmt.Println(s2,a)//[7 9] [1 7 9 4 5]
}
func main() {
a:=[]int{,,,,}
s1:=a[:] //[3 4 5]
s2:=a[:] //[2 3]
fmt.Println(s1,s2)
s2=append(s2,,,,,,,,,,)
s1[]=
fmt.Println(s1,s2,a)//[9 4 5] [2 3 1 1 1 1 1 1 1 1 1 1] [1 2 9 4 5]
//s2 append后长度超出容量 获得新地址不再指向a,s1的改变对其不影响
}

copy

func main() {
s1:=[]int{,,,,,}
s2:=[]int{,,}
// copy(s1,s2) //将s2复制到s1里
// fmt.Println(s1,s2) //[7 8 9 4 5 6] [7 8 9]
// copy(s2,s1)
// fmt.Println(s2)// [1 2 3]
copy(s2[:],s1)
fmt.Println(s2)//[7 8 1]
}

GO数组和切片的更多相关文章

  1. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  2. golang笔记——数组与切片

    一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...

  3. Go - 数组 和 切片(array、slice)

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...

  4. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  5. Go数组、切片、映射的原理--简明解析

    数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续 ...

  6. go语言的数组和切片区别

    这里不介绍数组和切片的使用技巧,主要看下2者的区别. 首先看下它们的定义: 数组:类型 [n]T 表示拥有 n 个 T 类型的值的数组. 切片:类型 []T 表示一个元素类型为 T 的切片. 看一个数 ...

  7. go语言基础知识笔记(二)之数组和切片

    数组和切片知识用的也是比较多,的给我们工作带来很大的便利 (一) 数组 定义:在golang中数组的长度是不可变,数组存放要求是同一种数据类型 //golang中数组定义的四种方法1.先声明,后赋值 ...

  8. Go语言--数组、切片、

    3.1 数组--固定大小的连续空间 3.1.1 声明数组 写法 var 数组变量名 [元素数量]T 说明: 变量名就是使用时的变量 元素的数量可以是表达式,最后必须为整型数值 T 可是是任意基本类型, ...

  9. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  10. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

随机推荐

  1. 线段树 - HDU1166 - 敌兵布阵

    2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...

  2. response.setHeader()用法

    response.setHeader()下载中文文件名乱码问题 收藏  1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data ...

  3. 关于Android中根据ID名动态获取资源的两个方法

    在开发中, 我们习惯了类似下面这种方式去实现引用资源: context.getResources().getDrawable(R.drawable.flower); 但是,当我们提前知道这个资源的id ...

  4. tensorflow conv2d的padding解释以及参数解释

    1.padding的方式: 说明: 1.摘录自http://stackoverflow.com/questions/37674306/what-is-the-difference-between-sa ...

  5. LeetCode OJ:Simplify Path(简化路径)

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  6. 在C++中指针和引用传值区别

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  7. Markdown博文快速转为微信文章

    介绍 技术博文在CSDN上,全是Markdown格式,最近看各位大佬又是个人网站又是个人微信公众号,突然发现: "个人博客小站 + 个人微信公众号 + CSDN + 掘金+ - = 程序员标 ...

  8. Sublime Text 3打开gbk编码的文件中文乱码的问题

    正在开发Wordpress主题,网上下载了一个博客模板,打开之后,发现里面的中文全是乱码 毕竟这玩意是外国人的东西,gbk是中文专用的编码,不支持很正常. 网上查了一下资料,需要安装一个Convert ...

  9. CentOS修改系统的默认启动模式为命令号界面

    CentOS在安装桌面之后,将图形界面设置为默认模式,给PC内存带来较大压力,所以希望修改系统的默认启动模式为命令号界面,而不启动图形界面.方法如下: 1.以 root用户登录系统:或者 用su切换到 ...

  10. 你所不知道的,Java 中操作符的秘密?

    在 Java 编程的过程中,我们对数据的处理,都是通过操作符来实现的.例如,用于赋值的赋值操作符.用于运算的运算操作符等.用于比较的比较操作符,还包括逻辑操作符.按位操作符.移位操作符.三元操作符等等 ...