2016-05-15 13 views
3

Ich habe die folgende StrukturFunktion kehrt sperren, indem Sie Wert

type Groups struct { 
    sync.Mutex 
    Names []strng 
} 

und folgende Funktion

func NewGroups(names ...string) (Groups, error) { 
    // ... 
    return groups, nil 
} 

Wenn ich überprüfen, für semantische Fehler über GoVet, ich bin dieses warking bekommen

NewGroups returns Lock by value: Groups 

Wie GoVet schreit, ist es nicht gut und welche Probleme kann dieser Code bringen? Wie kann ich das beheben?

+2

Embedding ein Mutex Zeiger stattdessen ('* sync.Mutex')? – tobiash

+0

Ja, aber wenn Sie sich Beispiele von Andrew Gerrand anschauen: https://blog.golang.org/go-maps-in-action, wurde er nicht vom Zeiger eingebettet. – maksadbek

Antwort

5

Sie müssen die sync.Mutex als Zeiger einzubetten:

type Groups struct { 
    *sync.Mutex 
    Names []strng 
} 

Ihren Kommentar zu Ihrer Frage Adressierung: In dem Artikel http://blog.golang.org/go-maps-in-action Mitteilung Gerrand ist nicht die Struktur aus einer Funktion zurückkehrt, aber es sofort verwendet , deshalb benutzt er keinen Zeiger. In deinem Fall gibst du es zurück, also brauchst du einen Zeiger, um keine Kopie des Mutex zu machen.

Update: Da @JimB darauf hinweist, dass es nicht ratsam ist, einen Zeiger auf einzubetten, ist es möglicherweise besser, einen Zeiger auf die äußere Struktur zurückzugeben und weiterhin den 10 als Wert einzubetten. Überlegen Sie, was Sie in Ihrem speziellen Fall erreichen möchten.

+0

Danke, jetzt ist es klar – maksadbek

+7

Man würde normalerweise eine '* Groups 'zurückgeben, anstatt einen Ponter einzubetten. – JimB

+0

Ja, diese bessere Lösung – maksadbek

Verwandte Themen