golang基础数据结构

简介: 一、概述:  这里主要讨论四种类型———数组、slice、map和结构体  数组和结构体是聚合类型;它们的值都是由很多个元素或者成员字段的值组成。数组是有同构元素组成——每个数组的元素的类型相同;结构体为异构元素组成——每个结构体不一定是同类型元素构成;数组和结构体都是有固定内存大小的数据结构;  slice和map则是动态的数据结构,它们需要动态增长;  需要注意的是函数中传递数组:一般而言,当调用函数时,函数的每个调用参数将会被赋值给函数内部的形式参数,所以函数参数接收的是一个复制的副本,而不是原始调用的变量。

一、概述:

  这里主要讨论四种类型———数组、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进行排序。

  

 

相关文章
|
7月前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
7月前
|
存储 Go iOS开发
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
|
7月前
|
存储 算法 Go
Golang 数据结构:图
Golang 数据结构:图
93 0
|
7月前
|
Go
《Go 简易速速上手小册》第3章:数据结构(2024 最新版)(下)
《Go 简易速速上手小册》第3章:数据结构(2024 最新版)(下)
33 1
|
7月前
|
存储 供应链 数据可视化
《Go 简易速速上手小册》第3章:数据结构(2024 最新版)(上)
《Go 简易速速上手小册》第3章:数据结构(2024 最新版)(上)
72 1
|
7月前
|
Go
golang数据结构篇之二叉树
golang数据结构篇之二叉树
40 0
|
7月前
|
Go
golang数据结构篇之栈和队列以及简单标准库
golang数据结构篇之栈和队列以及简单标准库
77 0
|
7月前
|
存储 安全 Java
Go 基础数据结构的底层原理(slice,channel,map)
Go 基础数据结构的底层原理(slice,channel,map)
100 0
|
2月前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
44 3
|
3月前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用