我的Go+语言初体验——GO+实现数据结构之【数组 切片 Map】(1)

简介: 我的Go+语言初体验——GO+实现数据结构之【数组 切片 Map】(1)

随着Go+ 的发布不久,正准备学习GO+,又刚好赶上这次征文的活动

以写促学,今后,我将带大家使用 GO+ 逐步 实现常见的数据结构 ,刚好一边学习GO+一边复习数据结构

今天是第一篇

我们使用 GO+ 来学习数据结构 之 数组、切片与Map

数组基本操作

声明

一维数组

初始化数组长度为1

var linearArray [1]int

根据数组内容自己推算长度


linearArray := [...]int{1,2,3}

对于var和:=的区别在于:var适合全局:=只能试用局部


Golang 中数组的初始值如果不声明,则默认是全部有初值的


比如 linearArray 这个数组声明了长度为 1, Go 的编译器会把这 1 个元素全都初始化为 0


bool 值类型的数组,如果不做赋值操作,则初始值全为 false


我们可以来试验一下

package main
func main() {
  var linearArray [1]int
  print linearArray[0]
}

1.png

package main
func main() {
  var linearArray [1]bool
  print linearArray[0]
}

2.png

二维数组

二维数组声明和其它语言差不多

var twoDimensionalArray [1][2]int

遍历

linearArray := [...]int{1,2,3}
for x <- linearArray, x > 1 {
    print x
}

3.png

另一种遍历方法:

linearArray := [...]int{5, 4, 3, 2, 1, 0}
for index, value := range linearArray {
    println "索引:",index,", 值: ",value
}

4.png

当然你也可以使用最基础的方式遍历


linearArray := [...]int{5, 4, 3, 2, 1, 0}
for i := 0; i < len(linearArray); i++ {
    println linearArray[i]
}

5.png

切片基本操作

数组是按值传递的(即是传递的副本),而切片是引用类型,传递切片的成本非常小,而且不定长,如果很难理解的话,可以暂时把它理解为"可以自定义长度的列表"或者是“可扩容的数组”


语法如下:


  • make([ ]Type, length, capacity)

其长度为切片的容量 capacity

  • make([ ]Type, length)

其长度记为切片的长度 length

  • [ ]Type{}
  • [ ]Type{value1, …, valueN}

使用make()函数创建切片、映射和通道,通过内置的函数 append() 来增加切片的容量。

slice := []int{}
for i := 0; i < 5; i++ {
    slice = append(slice, i)
}
print slice

6.png

此外,和python类似,我们可以这样提取区间数据

slice := []int{}
for i := 0; i < 5; i++ {
    slice = append(slice, i)
}
print slice[1:3]

7.png

提取slice中第一个开始到第三个数值(不包括第三个)


[n:m] 的意思就是取区间 [n,m)


从位置下标的角度上来说 [n-1,m-1) 可能更合适, 为什么呢?


我们可以来实现下这个功能

func ExtractInterval(sliceObject []int, start int, end int) []int {
  new_sliceObject := []int{}
  for i := start - 1; i < end-1; i++ {
  new_sliceObject = append(new_sliceObject, sliceObject[i])
  }
  return new_sliceObject
}
slice := []int{}
for i := 0; i < 5; i++ {
  slice = append(slice, i)
}
print ExtractInterval(slice, 1, 3)

8.png

你可以发现:在我们ExtractInterval方法中所实现的就是提取slice数组中的下标位置是0和1的数据



更多知识点


Go+ 切片的扩容规则


切片的扩容并不会改变原来的切片,它会生成一个容量更大的切片,然后将把原有的元素和新元素一并拷贝到新切片中. 一般的情况下,你可以简单地认为新切片的容量将会是原切片容量的 2 倍.


当原切片的长度大于或等于 1024 时,Go+会以原容量的 1.25 倍作为新容量的基准. 如果容量增加的太快,很容易浪费空间.


如果我们一次追加的元素过多,要大于 2 倍,那么新容量就会以新长度为基准. 比如你现在的切片长度为 5,现在一下往里面添加了 25 个元素,那么 Go+ 会直接创建一个长度为 30 的底层数组,然后把所有的数据拷贝进去.


Go+ 切片其底层数组永远不会改变


当切片需要扩容时,新的切片诞生的同时也会创建出新的底层数组,它只是把原数组的数据拷贝了进来,并未对其做任何的修改.




Map literal(集合)

声明

定义,个人感觉和Python是差不多的

MapLiteral := {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}

遍历

MapLiteral := {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
for k, v := range MapLiteral {
  println "k:[", k, "].v:[", v, "]\n"
}

9.png

删除

delete() 方法可以实现

delete(集合, key)

还可以试一下这样定义集合,顺便试验下delete() 方法

MapLiteral := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
delete(MapLiteral, "a")
for k, v := range MapLiteral {
  println "k:[", k, "].v:[", v, "]\n"
}

10.png

修改与增加

可以直接这样实现

MapLiteral := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
MapLiteral["a"] = 0
MapLiteral["f"] = 6
for k, v := range MapLiteral {
  println "k:[", k, "].v:[", v, "]\n"
}

11.png


练习


请使用GO+ 实现简单的 冒泡排序

Array := [...]int{123, 343, 143, 524, 462, 5672, 3467}
// 冒泡排序
for i := 0; i < len(Array); i++ {
  for j := 1; j < len(Array)-i; j++ {
  if Array[j] < Array[j-1] {
    Array[j], Array[j-1] = Array[j-1], Array[j]
  }
  }
}
print Array

12.png

目录
相关文章
|
7天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
17 1
|
6天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
7天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
7天前
|
Go
go语言创建字典
go语言创建字典
|
8天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
8天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
9天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
9天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
|
8天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
8天前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳