Golang中实现这个练习的更好方法有哪些

Golang中实现这个练习的更好方法有哪些 我正在尝试解决一个练习:给定一个切片,需要编写一个函数来打印原始切片,并在下一行打印切片元素加上索引值。

以下是我的实现方式:

package main

import "fmt"

func main() {

	myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
	original, added := addIndexToValue(myslice)
	fmt.Printf("Original Slice = %v\nAdding Index = %v\n", original, added)
}

func addIndexToValue(param []float32) ([]float32, []float32) {

	orig := make([]float32, len(param))
	copy(orig, param)
	for index, value := range param {
		orig[index] = value
		param[index] = value + float32(index)
	}
	return orig, param
}

以下是我得到的输出:

pritesh@debian:~/go/src/github.com/pritesh-ugrankar/slices1$ go run slices1.go 
Original Slice = [10.5 75.5 89.8 90 75]
Adding Index = [10.5 76.5 91.8 93 79]

有没有更好的方法来实现这个功能?


更多关于Golang中实现这个练习的更好方法有哪些的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

亚米尔, 谢谢。

更多关于Golang中实现这个练习的更好方法有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以按以下方式简化:

func main() {
  myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
  added := addIndexToValue(myslice)
  fmt.Printf("Original Slice = %v\nAdding Index = %v\n", myslice, added)
}

func addIndexToValue(orig []float32) ([]float32) {
  param := make([]float32, len(orig))
  for index, value := range orig {
     param[index] = value + float32(index)
  }
  return param
}

嗨Yamil, 这是我发现的另一种方法。这个练习的限制是函数的返回值必须同时包含原始值和加上索引后的值。

package main

import "fmt"

func main() {
	mySlice := []float32{10.5, 20.5, 30.5, 40.5, 50.5}
	origMySlice, indexAddedMyslice := addIndexToValue(mySlice)
	fmt.Printf("Orig : %v\nAdded: %v\n", origMySlice, indexAddedMyslice)
}

func addIndexToValue(orig []float32) ([]float32, []float32) {
	param := make([]float32, len(orig))

	for index, _ := range param {
		param[index] = orig[index] + float32(index)
	}

	/*
			也可以这样写:
		for index, value := range orig {
			param[index] = value + float32(index)
		}
	*/
	return orig, param
}

以下是运行结果:

C:\Users\pritesh\go\src\github.com\pritesh-ugrankar\slices1>go run slices1.go
Orig : [10.5 20.5 30.5 40.5 50.5]
Added: [10.5 21.5 32.5 43.5 54.5]

在Golang中,你的实现可以进一步优化,特别是避免修改原始切片并提高代码的清晰度。以下是几种改进方法:

方法1:使用函数式风格,不修改原切片

package main

import "fmt"

func main() {
    myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
    original, added := addIndexToValue(myslice)
    fmt.Printf("Original Slice = %v\nAdding Index = %v\n", original, added)
}

func addIndexToValue(param []float32) ([]float32, []float32) {
    result := make([]float32, len(param))
    for i, v := range param {
        result[i] = v + float32(i)
    }
    return param, result
}

方法2:使用更清晰的变量命名和单一职责

package main

import "fmt"

func main() {
    myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
    original := make([]float32, len(myslice))
    copy(original, myslice)
    
    indexedSlice := addIndexToValues(myslice)
    fmt.Printf("Original Slice = %v\nAdding Index = %v\n", original, indexedSlice)
}

func addIndexToValues(slice []float32) []float32 {
    result := make([]float32, len(slice))
    for i, v := range slice {
        result[i] = v + float32(i)
    }
    return result
}

方法3:使用append构建新切片

package main

import "fmt"

func main() {
    myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
    indexed := addIndexToSlice(myslice)
    fmt.Printf("Original Slice = %v\nAdding Index = %v\n", myslice, indexed)
}

func addIndexToSlice(slice []float32) []float32 {
    var result []float32
    for i, v := range slice {
        result = append(result, v + float32(i))
    }
    return result
}

方法4:使用更简洁的格式输出

package main

import "fmt"

func processSlice(slice []float32) (original, indexed []float32) {
    indexed = make([]float32, len(slice))
    for i, v := range slice {
        indexed[i] = v + float32(i)
    }
    return slice, indexed
}

func main() {
    myslice := []float32{10.5, 75.5, 89.8, 90.0, 75.0}
    original, indexed := processSlice(myslice)
    fmt.Printf("Original: %v\nIndexed:  %v\n", original, indexed)
}

主要改进点:

  • 避免修改原始切片参数
  • 使用更清晰的变量命名
  • 减少不必要的复制操作
  • 提高代码的可读性和可维护性

方法1是最推荐的实现,它保持了函数的纯净性,不产生副作用,同时代码简洁明了。

回到顶部