已解决:学习Golang时如何简化代码?

已解决:学习Golang时如何简化代码? 我正在学习Go语言。下面的代码是一个实验,基本上不言自明。它产生了预期的结果。

package main

import "fmt"

func main() {
	a := []int{1, 2, 3}
	z := map[string]func(x int) []int{
		"add": func(x int) (b []int) {
			b = a
			for k, _ := range b {
				b[k] += x
			}
			return
		},
		"sub": func(x int) (b []int) {
			b = a
			for k, _ := range b {
				b[k] -= x
			}
			return
		},
	}
	fmt.Println("add 3:", z["add"](3))
	fmt.Println("sub 100:", z["sub"](100))
}

认为 b = a 可以在保持相同行为的情况下被消除,但该怎么做呢?

我想练习我对切片、映射和匿名函数的理解,这就是我采用这种方法的原因。

注意:我想遍历整个 a 切片,无论它是3个元素还是100个。

编辑:Stack overflow 来帮忙了!。这基本上归结为我根本不需要重新赋值,并且我使用索引的思路是正确的。以下是我最终得到的代码:

package main

import "fmt"

func main() {
	a := []int{1, 2, 3}
	z := map[string]func(x int) []int{
		"add": func(x int) []int {
			for k, _ := range a {
				a[k] += x
			}
			return a
		},
		"sub": func(x int) []int {
			for k, _ := range a {
				a[k] -= x
			}
			return a
		},
	}
	fmt.Println("add 3:", z["add"](3))
	fmt.Println("sub 100:", z["sub"](100))
}

更多关于已解决:学习Golang时如何简化代码?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于已解决:学习Golang时如何简化代码?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的简化方案是正确的。通过直接操作原始切片 a,你避免了不必要的赋值 b = a,同时保持了代码的功能。这里的关键在于理解切片是引用类型,直接修改 a 的元素会影响底层数组。

以下是你的简化代码示例:

package main

import "fmt"

func main() {
	a := []int{1, 2, 3}
	z := map[string]func(x int) []int{
		"add": func(x int) []int {
			for i := range a {
				a[i] += x
			}
			return a
		},
		"sub": func(x int) []int {
			for i := range a {
				a[i] -= x
			}
			return a
		},
	}
	fmt.Println("add 3:", z["add"](3))
	fmt.Println("sub 100:", z["sub"](100))
}

这段代码直接遍历 a 的索引并修改其元素值,然后返回 a。由于切片是引用类型,函数内部对 a 的修改会反映在原始切片上。输出结果与原始代码一致:

add 3: [4 5 6]
sub 100: [-96 -95 -94]

这种简化方式减少了内存分配(不需要创建 b 变量),同时代码更简洁。注意,由于直接修改了原始切片,多次调用这些函数会累积修改效果。

回到顶部