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