一、概述:

  这里主要讨论四种类型———数组、slice、map和结构体

  数组和结构体是聚合类型;它们的值都是由很多个元素或者成员字段的值组成。数组是有同构元素组成——每个数组的元素的类型相同;结构体为异构元素组成——每个结构体不一定是同类型元素构成;数组和结构体都是有固定内存大小的数据结构;

  slice和map则是动态的数据结构,它们需要动态增长;

  需要注意的是函数中传递数组:一般而言,当调用函数时,函数的每个调用参数将会被赋值给函数内部的形式参数,所以函数参数接收的是一个复制的副本,而不是原始调用的变量。因此函数参数传递的机制导致了传递大数组将十分低效,并且对数组参数的任何修改都将发生在复制的数组上,而并不能直接修改调用时原始的数组变量。与其他语言的做法(隐式地作为引用或者指针对象传入)不同,golang可以显示传入一个数组指针:

 func zero(ptr *[3]int) {
for i := range ptr {
ptr[i] = 0
}
fmt.Println(ptr)
}
myarray := [...]int{10, 20, 30}
for _, v := range myarray {
fmt.Println(v)
}
zero(&myarray) // 注意 &

  即便如此,数组依然很少用作函数参数,我们一般使用slice来替代数组;

二、slice

  slice(切片)代表变长的序列,序列的元素是同类型的;slice是轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能;

  slice由三部分构成:指针、长度、容量

 func reverse(s []int) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
} myarray := [...]int{10, 20, 30}
for _, v := range myarray {
fmt.Println(v)
}
//zero(&myarray)
reverse(myarray[:])   //传slice

  warning:slice之间不能进行比较,因此不用用==来判断两个slice是否含有相同的元素,如果需要比较slice则需要通过标准库提供的高度优化的bytes.Equel来判别两个slice是否相同([]byte), 但是对于其他类型的slice, 必须展开每个元素进行比较:

func equal(x, y [] string) bool {
if len(x) != len(y) {
return false
}
for i := range x{
if x[i] != y[i] {
return false
}
}
return true
}

  唯一合法的slice比较操作是和nil比较:

  if  summer  == nil { /* ... */}

三、map

 ages := make(map[string]int)
或ages := map[string]int {
"allen": 32,
"pual": 34,
}

  map中的元素并不是一个变量,因此不能对map的元素进行取址操作:

  _ = &ages["bob"]    //compile error: cannot take address of map element

  禁止对map元素取址的原因是map可能随着元素数量增长而重新分配更大的内存空间,从而可能对之前的地址失效;

  map遍历:map的迭代顺序是不确定的,并且不通的哈希函数实现可能导致不同的遍历顺序,在实践中,遍历的顺序是随机的,每一次遍历的顺序都不同的,这是故意的,每次都是使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现,如果要按顺序遍历key/value对,必须显示对key进行排序,可以使用sort包对Strings函数对字符串slice进行排序。

  

golang基础数据结构的更多相关文章

  1. golang基础数据结构链表

    链表 链表(Linked list),是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer). 每个节点包含下一个节点的地址,这样把所有的节点串起来了, ...

  2. golang基础知识之encoding/json package

    golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...

  3. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  4. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  5. Redis 基础数据结构之二 list(列表)

    Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下list(列表)这种数据结构, ...

  6. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  7. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  8. 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  9. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

随机推荐

  1. linux C连接mysql

    linux 环境下C语言连接数据库首先要配置环境 1,确定你的linux下安装mysql我们可以做个测试. 打开你的终端,在终端下输入:service mysqld status [root@bogo ...

  2. jQuery——AJAX(一)

    jQuery.ajax(options):通过HTTP请求加载远程数据, 参数:options(可选),ajax请求设置.所有选项都是可选的. 返回值:XMLHttpRequest function ...

  3. 如何改变word修订模型下的视图

    在Word中执行与Find.Range等相关的操作时,需对修订模式下的文档进行特殊处理. 核心知识点 Word中的 RevisionsView 属性只有两种设置:显示标记的最终状态(Final Sho ...

  4. 解决安装Visual Studio 2012后SQL Server 2008 远程过程调用失败的问题

    安装了Visual Studio 2012后,打开SQL Server 2008配置管理器,发现了一个问题.如下图 解决办法:

  5. Java单例模式的线程安全问题

    单例模式有两种书写模式:饿汉式和懒汉式. 1.饿汉式 class Single{ private final static Single s = new Single(); private Singl ...

  6. HTML中的figure与figcaption标签

    本来想分两篇文章来解释说明figure.figcaption的,但是这俩个标签都是定义图文的,所以我们合起来讲解,大家更能容易接受. 大家在写xhtml.html中常常用到一种图片列表,图片+标题或者 ...

  7. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  8. ASP.net+SQL server2008简单的数据库增删改查 VS2012

    工具:VS2012 数据库:SQL server 简单说明:根据老师上课给的代码,进行了简单的改正适用于VS2012环境,包括注册.登录.查询.修改.删除功能,多数参考了网上的代码 百度云源代码连接t ...

  9. ORACLE OCP认证

    基本情况介绍 Oracle产品非常多,这里说的是Oracle数据库认证体系. Oracle数据库认证体系包括3层,分别是OCA(助理),OCP(专家),OCM(大师) 一般情况下,需一级一级认证,也就 ...

  10. thinkphp+redis实现秒杀功能

    好久没来整理文章了,闲了没事写篇文章记录下php+redis实现商城秒杀功能. 1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbi ...