Go语言学习笔记(四) [array、slice、map]

日期:2014年7月22日

一、array[数组]

1、定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内容的类型。

例如:

var arr[10] int

arr[0] = 1

arr[1] = 2

数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素。另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针。

2、数组的复合声明。a :=[3]int{1,2,3}或简写为a:=[...]int{1,3}(Go会自动统计元素个数)

3、多维数组

例如:a := [2][2]int{ [2]int{1,2},[2]int{3,4} } 等价于a := [2][2]int{ [...]int{1,[...]int{3,4} }

在2010-10-27发布版中,当声明的数组的元素类型都一致,那么可以省略内部元素的类型。上面的声明方式可以改写为a := [2][2]int{ {1,{3,4} }

4、数组长度也是类型的一部分,因此具有不同长度的数组,其类型是不同的。

二、slice[切片]

1、slice 与 array 接近,但是在新的元素加入的时候可以增加长度。slice 总是指向底层的一个 array。slice本身不是数组,slice 是一个指向 array的指针,这是其与

array 不同的地方;slice 是引用类型, 这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。

2、创建一个slice:sl := make([]<type>,len,cap),cap值可以省略(省略时,值等同于len),len表示存放元素的个数,cap表示容量。容量的大小

cap =<real_cap < 2 * cap,当大小超过容量cap时,会容量会自动升级,但是必须说明的是,自动升级后,将会重新分配连续的内存地址。

3、一个slice可以通过a[i:j]的方式创建,新建的slice将会指向a,从i开始,到(j-1)结束,长度=j-i。

4、slice的append操作。slice可以在尾部追加元素,甚至还可以将一个slice追加到另一个slice的尾部,如果最终的长度没有超过原始的slice,那么append操作将返回原来的slice,否则将重新分配内存地址。

5、slice的copy操作。copy操作返回复制的元素的个数,复制的数量是len(src)和len(dst)中最小的值。

6、slice操作的一些示例

a:=[6]int{1,3,4,5,6}//数组下标从0开始
s1:=a[0:4]//1,4
s2:=a[:]//1,6,是a[0:len(a)]的简写
s3:=a[:3]//1,是a[0:3]的简写
//s4:=a[1:7]//数组越界,抛出invalidsliceindex7(outofboundsfor6-elementarray)
s5:=s2[:]//1,此时的s5和s2依然指向a,可通过内建函数println(slice)打印出结果对比。

s6:=[]int{1}
s7:=append(s6,2)
s8:=append(s7,3)
//s9:=append(s7,s6...)//注意这后面有三个点,不加上的话会报类型错误。我开始还以为是省略号,纠结了半天。

varar=[...]int{1,7}
n1:=copy(s10,ar[0:])//返回结果n1=6,此时s10的值为[123567]
n2:=copy(s10,s10[2:])//返回结果n2=4,此时s10的值为[356767]

关于slice容量扩容重新分配内存地址的问题也没有完全弄明白,以后再补充进来吧。

三、map[字典]

1、map在Go语言中是作为一种内建类型存在。一般定义map的方法为:map[<from type>]<to type>

例如:sexes := map[string]string{

"Man":"男",

"Male":"女",//后面的逗号必须要写

}

2、声明map:mapName := make(map[type1]type2){}

3、map索引取值,mapName["key"],例如:sexes["Male"]

4、遍历map,可以使用range,例如:

for _,sex := range sexes {

fmt.Println(sex)

}

5、向map中增加元素:mapName["newKey"]=value,例如:sexes["unknow"] = "未知性别"//向map增加元素

6、删除map的元素:delete(mapName,"key"),例如:delete(sexes,"unknow")//删除map中的元素,会删除map中由m[x]建立的实例

7、检查map中是否存在某元素

例如:

var val string

var present bool

val,present = sexes["nothing"]

也可以直接使用“逗号ok”的形式,例如:v,ok := sexes["Male"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s &quot;strings&quot; import &quot;fmt&quot; var p = fmt.Println func main() { p(&quot;Contains: &quot;, s.Contains(&quot;test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考