博客
关于我
04_Go语言基础学习_闭包、数组、切片、map数据结构
阅读量:796 次
发布时间:2023-03-22

本文共 2005 字,大约阅读时间需要 6 分钟。

闭包

闭包(Closure)是 Go语言 中一个核心概念,它描述了一个函数与其相关的引用环境(Environment)结合而成的实体。闭包在函数式编程中是一个非常重要的概念,因为它允许函数在被定义时携带其上下文信息。

以以下代码为例:

package main
import (
"fmt"
)
func main() {
var f = Adder()
fmt.Print(f(1), "-")
fmt.Print(f(20), "-")
fmt.Print(f(300))
}
func Adder() func(int) int {
var x int
return func(delta int) int {
x += delta
return x
}
}

在这个例子中,Adder 函数返回一个闭包。这个闭包记住了在 Adder 函数中的变量 x。当我们调用 f(1)f(20)f(300) 时,每个调用都会修改同一个 x,从而导致累积的结果。

数组

数组(Array)是 Go语言 中的一种基本数据结构,它是同一种数据类型的固定长度的序列。以下是关于数组的关键点:

  • 定义: 数组的定义方式是 var a [len] type,其中 len 是数组的长度。例如:

    var a [5] int

    一旦数组被定义,其长度就无法改变。

  • 长度: 数组的长度是其类型的一部分,因此 var a [5] intvar a [10] int 是不同的类型。

  • 访问: 数组可以通过下标(从 0 开始)进行访问,最后一个元素的下标是 len - 1。访问越界会触发 panic 错误。

  • 副本: 数组是值类型,修改副本的值不会影响原数组。

  • 操作: 以下是通过函数 modify 修改数组的示例:

    package main
    import (
    "fmt"
    )
    func modify(arr *[5]int) {
    arr[0] = 100
    arr[1] = 65
    }
    func main() {
    var a [5] int
    modify(&a)
    for i := 0; i < len(a); i++ {
    fmt.Println(a[i])
    }
    }
  • 切片

    切片(Slice)是数组的一个引用,因此它是引用类型。以下是关于切片的关键点:

  • 可变性: 切片的长度可以改变,因此它是一个可变的数组。

  • 遍历: 切片可以通过 len() 函数获取长度,遍历方式与数组相同。

  • 容量: 切片的容量可以通过 cap 函数获取,表示切片最大的容量。满足 0 <= len(slice) <= cap

  • 定义: 切片的定义方式是 var slice []type。例如:

    var str []string
  • 初始化: 切片可以通过数组的子序列初始化。例如:

    slice := arr[start:end]

    其中 end 是不包含在切片中的索引。

  • 创建切片: Go语言 提供了 make() 函数来创建切片。例如:

    slice := make([]int, 5)
    slice := make([]int, 5, 10)

    第三个参数是容量(可选)。

  • 修改切片: 可以使用 append() 函数动态增加切片的元素。例如:

    slice := make([]int, 0)
    slice = append(slice, 10)
  • 遍历: 遍历切片的方式是通过 for index, val := range slice 来实现的。

  • 字符串与切片: 字符串在底层是一个 byte 数组,因此可以进行切片操作。例如:

    str := "hello world"
    s1 := str[0:4]
    s2 := str[3:]
  • 映射

    映射(Map)是 Go语言 中另一种基本数据结构,它存储的是 key-value 对。以下是关于映射的关键点:

  • 声明: 映射的声明方式是 var map map[keytype] valuetype,但需要使用 make() 初始化。例如:

    var a map[string]string = make(map[string]string, 10)
  • 操作

    • 插入和更新:a["key"] = value
    • 查找:value, ok := a["key"]
    • 遍历:for k, v := range a
    • 删除:delete(a, "key")
  • 引用类型: 映射是引用类型,因此修改映射的内容会影响原映射。

  • 多维映射: 可以创建嵌套映射。例如:

    type Point struct {
    X int
    Y int
    }
    var points map[Point]int
  • 排序: 要对映射进行排序,可以先获取所有键,排序后再遍历。

  • 转载地址:http://fnqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现找出由两个 3 位数字的乘积构成的最大回文数的算法 (附完整源码)
    查看>>
    Objective-C实现找到具有 500 个除数的第一个三角形数算法(附完整源码)
    查看>>
    Objective-C实现找到最近的点对之间的距离算法(附完整源码)
    查看>>
    Objective-C实现抓包实例(附完整源码)
    查看>>
    Objective-C实现抽签抓阄(附完整源码)
    查看>>
    Objective-C实现抽象工厂模式(附完整源码)
    查看>>
    Objective-C实现拉格朗日插值法(附完整源码)
    查看>>
    Objective-C实现指定内存空间获取时间的函数(附完整源码)
    查看>>
    Objective-C实现按位倒序(附完整源码)
    查看>>
    Objective-C实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
    查看>>
    Objective-C实现排队叫号系统(附完整源码)
    查看>>
    Objective-C实现控制NRP8S功率计读取功率 (附完整源码)
    查看>>
    Objective-C实现控制程控电源2306读取电流 (附完整源码)
    查看>>
    Objective-C实现摄氏温度和华氏温度互转(附完整源码)
    查看>>
    Objective-C实现播放器(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现操作注册表 (附完整源码)
    查看>>
    Objective-C实现改变图片亮度算法(附完整源码)
    查看>>
    Objective-C实现数字图像处理算法(附完整源码)
    查看>>
    Objective-C实现数组切片(附完整源码)
    查看>>