可变参数打包和解包lang

可变参数打包和解包lang

我在浏览github时发现了此功能:

func Accumulate(s []string, f func(st string) string) (result []string) {
    for _, v := range s {
        result = append(result, []string{f(v)}...)
    }
    return result
}

可以将此方法简化为以下方法,还是我缺少一些东西:
func Accumulate(s []string, f func(st string) string) (result []string) {
    for _, v := range s {
        result = append(result, f(v))
    }
    return result
}

最佳答案

您编写的版本是正确且理智的。我写了一个基准:

package p

import (
    "testing"
    "strings"
)

var s = []string{"hello", "world", "this", "new", "world"}

func BenchmarkAcc1(b *testing.B) {
    for n := 0; n < b.N; n++ {
        Accumulate(s, strings.ToUpper)
    }
}

func BenchmarkAcc2(b *testing.B) {
    for n := 0; n < b.N; n++ {
        Accumulate2(s, strings.ToUpper)
    }
}

这是我得到的一些结果:
% go test -benchtime=10s -bench=.
testing: warning: no tests to run
PASS
BenchmarkAcc1   10000000          1510 ns/op
BenchmarkAcc2   10000000          1492 ns/op
ok      _/home/satran/test  33.064s

如您所见,也没有任何性能提升,实际上您的版本效果更好。

来源如下:
package p

func Accumulate(s []string, f func(st string) string) (result []string) {
    for _, v := range s {
        result = append(result, []string{f(v)}...)
    }
    return result
}

func Accumulate2(s []string, f func(st string) string) (result []string) {
    for _, v := range s {
        result = append(result, f(v))
    }
    return result
}

关于go - 可变参数打包和解包lang : '[]string{f(v)}…' ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28787489/

10-11 18:25