在 go lang 中进行可变参数打包和解包:'[]string{f(v)}...'

variadic pack and unpack in go lang: '[]string{f(v)}...'

我在浏览时发现了这个功能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
}