2015-02-28 1 views
1

Je trouve cette fonction lors de la navigation github:Pack variadique et déballer en aller lang: '[] string {f (v)} ...'

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

cette méthode pourrait être simplifiée à ce qui suit, ou Ai-je manqué quelque chose:

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

Oui, votre version est beaucoup plus sain. – Volker

+1

Je me demande si le compilateur optimise le premier exemple d'une façon ou d'une autre ... –

Répondre

1

La version que vous avez écrite est correcte et saine à comprendre. J'ai écrit une référence:

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

Voici quelques résultats que j'ai obtenu:

% 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 

Comme vous pouvez le voir, il n'y a pas de gain de performance non plus, en fait, votre version fonctionne mieux.

Voici la 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 
} 
+0

Note: plutôt que d'exécuter 'go test -bench' à plusieurs reprises juste (apparemment) pour éliminer le bruit, vous pourriez avoir utilisé quelque chose comme' -benchtime = 10s'. –

+0

Merci, l'a mis à jour. – satran