后端array、slice学习

108 阅读2分钟

Go 语言函数参数传递与数组修改

在 Go 语言中,当一个数组作为参数传递给函数时,实际上传递的是数组的副本,而不是数组的引用。这意味着在函数内部对数组的任何修改都只影响副本,而不影响原始数组。

下面是一个示例代码,展示了这个特性:

func AppendInt() {
	intArray := [3]int64{1, 2, 3}
	func(arr [3]int64) {
		arr[2] = 4
		fmt.Println("inner func array:",arr)
	}(intArray)

	fmt.Println("outer func array:",intArray)
}

在这个示例中,我们定义了一个名为 intArray 的整数数组,并将其传递给一个匿名函数。在匿名函数内部,我们修改了数组的第三个元素的值。然后,我们分别打印了匿名函数内部的数组和外部的数组。

运行这段代码,你会看到以下输出:

inner func array: [1 2 4]
outer func array: [1 2 3]

可以看到,尽管在匿名函数内部修改了数组的元素,但原始数组并没有被改变。这是因为在函数内部操作的是数组的副本,而不是原始数组本身。

这个特性在 Go 语言中非常重要,因为它确保了函数参数的不可变性,从而避免了在函数内部意外修改外部数据的情况。这对于编写安全和可维护的代码非常有帮助。

Go 语言切片(slice)学习笔记

切片(slice)是 Go 语言中一种非常灵活和强大的数据结构,它类似于动态数组,但又比数组更灵活。切片是一个引用类型,它指向一个底层数组,并且可以动态地增长或缩小。

package main

import "fmt"

func main() {

// 创建一个长度为 3 的切片
s := make([]string, 3)
// 给切片的每个元素赋值
s[0] = "a"
s[1] = "b"
s[2] = "c"
// 打印切片的第三个元素
fmt.Println("get:", s[2])   // c
// 打印切片的长度
fmt.Println("len:", len(s)) // 3

// 向切片追加一个元素
s = append(s, "d")
// 向切片追加两个元素
s = append(s, "e", "f")
// 打印追加元素后的切片
fmt.Println(s) // [a b c d e f]

// 创建一个新的切片,长度与 s 相同
c := make([]string, len(s))
// 将 s 的内容复制到 c
copy(c, s)
// 打印复制后的切片
fmt.Println(c) // [a b c d e f]

// 打印切片的子切片,从索引 2 到 4(不包括 4)
fmt.Println(s[2:5]) // [c d e]
// 打印切片的子切片,从索引 0 到 4(不包括 4)
fmt.Println(s[:5])  // [a b c d e]
// 打印切片的子切片,从索引 2 到末尾
fmt.Println(s[2:])  // [c d e f]

// 直接创建一个包含四个元素的切片
good := []string{"g", "o", "o", "d"}
// 打印切片
fmt.Println(good) // [g o o d]

}