dongyanling9248 2015-02-28 22:04
浏览 34
已采纳

可变参数打包并解压到go lang:“ [] string {f(v)}…”

I found this function while browsing github:

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

Could this method be simplified to the following, or am I missing something:

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

1条回答 默认 最新

  • doubiaozhan0745 2015-03-01 21:13
    关注

    The version you have written is correct and sane to understand. I wrote a benchmark:

    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)
        }
    }
    

    Here are a few results I got:

    % 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
    

    As you can see there is no performance gain either, in fact your version works better.

    Here is the source:

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序