2017-07-27 1 views
0

Ich habe eine Funktion, die eine zufällige int64 und gibt es als interface{} wie folgt erzeugt:zusätzliche Zuweisung, wenn Schnittstelle Rückkehr {} statt int64

func Val1(rnd rand.Source) interface{} { 
return rnd.Int63() 
} 

jetzt diese Funktion betrachten, die tut das Gleiche, aber kehrt ein int64

func Val2(rnd rand.Source) int64 { 
return rnd.Int63() 
} 

gebenchmarkt ich die beiden Funktionen mit diesem (go test -bench=. -benchmem):

func BenchmarkVal1(b *testing.B) { 
    var rnd = rand.NewSource(time.Now().UnixNano()) 
    for n := 0; n < b.N; n++ { 
     Val1(rnd) 
    } 
} 

func BenchmarkVal2(b *testing.B) { 
    var rnd = rand.NewSource(time.Now().UnixNano()) 
    for n := 0; n < b.N; n++ { 
     Val2(rnd) 
    } 
} 

und bekam Folowing Ergebnisse:

BenchmarkVal1-4 50000000   32.4 ns/op   8 B/op   1 allocs/op 
BenchmarkVal2-4 200000000  7.47 ns/op   0 B/op   0 allocs/op 

Wo kommt die zusätzliche Zuteilung in Val1() kommen aus? Kann es vermieden werden, wenn eine interface{} zurückgegeben wird?

Antwort

5

Ein Schnittstellenwert ist ein Wrapper unter der Haube, ein Paar des konkreten Werts, der im Schnittstellenwert und seinem Typdeskriptor gespeichert ist.

Lesen Sie diese für weitere Informationen: The Laws of Reflection #The representation of an interface

Also, wenn Sie einen Wert von interface{} Typ, ein interface{} Wert implizit erstellt zurückkehren wollen wird (wenn der Wert zurückgegeben wird nicht bereits diese Art ist), das wird Halten Sie die ganze Zahl und ihren Typdeskriptor, der den Typ int64 bezeichnet. Du kannst das nicht vermeiden.

interface{} ist ein spezieller Schnittstellentyp (mit 0 Methoden). Sein Wert beträgt nur 8 Bytes, wie Sie auf der Benchmark-Ausgabe sehen. Andere Schnittstellentypen sind größer (doppelt), da sie neben dem dynamischen Typ und Wert auch den statischen Methodensatz des Schnittstellentyps identifizieren müssen.

Auch sicher sein, diese informative Antwort zu überprüfen: Go: What's the meaning of interface{}?

Wenn Sie mehr Informationen über die Implementierung/Interna wollen, empfehle ich diesen Beitrag: How Interfaces Work in Golang

+1

wie immer @icza Sie Ihr Gewicht in Gold wert sind –

Verwandte Themen