GO数组和切片
数组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 |
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 |
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数组和切片的更多相关文章
- GO语言总结(3)——数组和切片
上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...
- golang笔记——数组与切片
一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...
- Go - 数组 和 切片(array、slice)
一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...
- GO语言数组和切片实例详解
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
- Go数组、切片、映射的原理--简明解析
数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续 ...
- go语言的数组和切片区别
这里不介绍数组和切片的使用技巧,主要看下2者的区别. 首先看下它们的定义: 数组:类型 [n]T 表示拥有 n 个 T 类型的值的数组. 切片:类型 []T 表示一个元素类型为 T 的切片. 看一个数 ...
- go语言基础知识笔记(二)之数组和切片
数组和切片知识用的也是比较多,的给我们工作带来很大的便利 (一) 数组 定义:在golang中数组的长度是不可变,数组存放要求是同一种数据类型 //golang中数组定义的四种方法1.先声明,后赋值 ...
- Go语言--数组、切片、
3.1 数组--固定大小的连续空间 3.1.1 声明数组 写法 var 数组变量名 [元素数量]T 说明: 变量名就是使用时的变量 元素的数量可以是表达式,最后必须为整型数值 T 可是是任意基本类型, ...
- Go语言数组和切片的原理
目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...
- Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】
目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...
随机推荐
- javascript日期格式处理
一. 服务端返回的日期和时间之间有T Asp.net MVC中 action返回前台的日期类型数据 是带有 T的,如: 2015-07-07T10:15:01. 这样的数据在Chrome浏览器,会自动 ...
- Rotate Image,N*N矩阵顺时针旋转90度
public class RotateImage { public void rotate(int[][] matrix) { if(matrix.length == 1 && mat ...
- KNN 算法,以及与Kmeans的简单对比
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
- Android源码下载和编译过程
这是我在编译android源码时整理记录的编译步骤和错误解决方法,期间参考了一些网上的博客和教程. 第一步: 安装ubuntu12.04,分配一盘空间50G,2G内存.如果分配1G内存编译时将报错.( ...
- linux find命令使用(转)
常用命令 find (目录) [-type d | f] (文件夹 | 文件) -name (名称,可使用正则表达式) find /root -name "*core&q ...
- git网站
https://backlog.com/git-tutorial/cn/ ------------------------------------------------------------- ...
- C# 构造函数调用顺序
了解C#的一个类的加载过程,对于语言机制的理解和写出高效的语言很有帮助,这里简单介绍一下类的实例的构造函数调用过程.C#类的实例的构造过程是,先为实例的数据字段分配内存,并对所有字段按字节置零(0或者 ...
- IOS-RunTime应用
什么是Runtime 总结起来,iOS中的RunTime的作用有以下几点: 1.发送消息(obj_msgSend) 2.方法交换(method_exchangeImplementations) 3.消 ...
- List排序共通代码
此共通方法可以根据特定字段进行排序 package com.gomecar.index.common.utils; import java.lang.reflect.Method; import ja ...
- Qt中切换窗口功能的实现
两条语句就能够实现了: this->newNC.setWindowFlags(Qt::WindowStaysOnTopHint); this->newNC.show(); mark一下,防 ...