golang基础数据结构

一、概述:

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

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

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

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

 1 func zero(ptr *[3]int) {
 2     for i := range ptr {
 3         ptr[i] = 0
 4     }
 5     fmt.Println(ptr)
 6 }
 7     myarray := [...]int{10, 20, 30}
 8     for _, v := range myarray {
 9         fmt.Println(v)
10     }
11     zero(&myarray)  // 注意 &

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

二、slice

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

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

 1 func reverse(s []int) {
 2     for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
 3         s[i], s[j] = s[j], s[i]
 4     }
 5 }
 6
 7     myarray := [...]int{10, 20, 30}
 8     for _, v := range myarray {
 9         fmt.Println(v)
10     }
11     //zero(&myarray)
12     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

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

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

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

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

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

  

 

时间: 2024-11-03 22:17:56

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

Oracle恢复内部原理:基础数据结构

基础数据结构 2.1  控制文件 控制文件包含了数据库中所有其他文件的状态信息. 控制文件包含了如下几类数据: A.      数据库信息记录(一条) B.      数据文件记录(每个数据文件一条) C.      线程记录(每个线程一条.注:每个实例一个线程) D.      日志文件记录(每个日志文件一条) E.       文件名记录(每个数据文件或者日志文件成员一条) F.       日志历史记录(每个已经完成的日志文件一条) 控制文件的被后面文档引用到的字段如下,后面是引用该字段的

Flink内存管理源码解读之基础数据结构

在分布式实时计算领域,如何让框架/引擎足够高效地在内存中存取.处理海量数据是一个非常棘手的问题.在应对这一问题上Flink无疑是做得非常杰出的,Flink的自主内存管理设计也许比它自身的知名度更高一些.正好最近在研读Flink的源码,所以开两篇文章来谈谈Flink的内存管理设计. Flink的内存管理的亮点体现在作为以Java为主的(部分功能用Scala实现,也是一种遵循JVM规范并依赖JVM解释执行的函数式编程语言)的程序却自主实现内存的管理而不完全依赖于JVM的内存管理机制.它的优势在于灵活

Redis源码学习——基础数据结构之SDS

Redis数据结构-SDS Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 首先介绍下Redis的基础数据结构 -- SDSRedis没有使用传统C语言的字符串(字符数组)表示.而是自己构建了一种名为sds(Simple Dymamic String)的抽象类型,作为redis的默认字符类型. SDS用于保存数据库中的字符串值,用户客户端的输入的缓冲区,AOF模块中的缓冲区都是由SDS实现的. SDS相比于C字符串的优点: 常数复杂度获取字符

OceanBase分布式存储引擎公共模块——基础数据结构

OceanBase分布式存储引擎公共模块--基础数据结构 1.哈希表 为了提高随机读取性能,UpdateServer支持创建哈希索引,这个哈希索引结构就是LightlyHashMap,代码如下: template <typename Key, typename Value> class LightlyHashMap { public: //插入一个<key,value>对到哈希表 inline int insert(const Key& key, const Value&a

c语言基础-数据结构C语言版二叉树的问题。

问题描述 数据结构C语言版二叉树的问题. strong text #include "stdio.h" #include "malloc.h" #include "stdlib.h" #include "conio.h" #define stacksize 100 #define DataType char //便于后期修改.可以直接去修改char 类型来达到快速的修改,在程序长的情况下. typedef struct nod

Golang基础学习总结

1.不支持继承 重载 ,比如C++Java的接口,接口的修改会影响整个实现改接口的类行为的修改,Go 设计者认为这一特点或许根本没用. 2.必任何函数定义必须花括号跟在函数声明后面而不能换行 如 func  funca(a int){},在Go语言中 函数也是一种类型 可以被推导  使用支持匿名函数 和闭包.  函数的返回值支持多重返回类似Python , 如果不赋值  整数类型默认 0     浮点数类型默认0.0   error类型 默认是nil 3.不用的包一定不要引入,这是Go的原则,就

Machine Learning On Spark——第二节:基础数据结构(二)

作者:周志湖 微信号:zhouzhihubyond 本节主要内容 IndexedRowMatrix BlockMatrix 1. IndexedRowMatrix的使用 IndexedRowMatrix,顾名思义就是带索引的RowMatrix,它采用case class IndexedRow(index: Long, vector: Vector)类来表示矩阵的一行,index表示的就是它的索引,vector表示其要存储的内容.其使用方式如下: package cn.ml.datastruct

[数据库]MySQL索引背后的数据结构及算法原理

一 写在前面的话 在编程领域有一句人尽皆知的法则"程序 = 数据结构 + 算法",我个人是不太赞同这句话(因为我觉得程序不仅仅是数据结构加算法),但是在日常的学习和工作中我确认深深感受到数据结构和算法的重要性,很多东西,如果你愿意稍稍往深处挖一点,那么扑面而来的一定是各种数据结构和算法知识.例如几乎每个程序员都要打交道的数据库,如果仅仅是用来存个数据.建建表.建建索引.做做增删改查,那么也许觉得数据结构和这东西没什么关系.不过要是哪天心血来潮,想知道的多一点,想研究一下如何优化数据库,

《python 与数据挖掘 》一 2.4 数据结构

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第2章,第2.4节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 2.4 数据结构 Python中的绝大部分数据结构可以被最终分解为三种类型:标量(Scaler),序列(Sequence),映射(Mapping).这表明了数据存储时所需的基本单位,其重要性如同欧式几何公理之于欧式空间.在第2.2节中,我们已经详细叙述了"标量",如整数.浮点数等数据类型.这里