Return Referenz auf Struktur im Gehen-lang
Ich bin mit einigen Gedanken Probleme mit dem folgenden code
package main
import (
"fmt"
)
type Company struct {
Name string
Workers []worker
}
type worker struct {
Name string
Other []int
}
func (cmp *Company) NewWorker(name string) worker {
wrk := worker{Name: name}
cmp.Workers = append(cmp.Workers, wrk)
return wrk
}
func main() {
cmp := Company{}
cmp.Name = "Acme"
wrk := cmp.NewWorker("Bugs")
for i := 1; i <= 10; i++ {
wrk.Other = append(wrk.Other, i)
}
fmt.Println(wrk)
fmt.Println(cmp)
}
https://play.golang.org/p/Bja7u148mg
Wie Sie sehen können wird der code nicht wieder die Arbeiter, die ich erschaffe, sondern eine Kopie davon. Wie bekomme ich wieder die eigentlichen Arbeiter? Ich habe versucht, einige Varianten von * und & auf der anderen die Arbeitnehmer, aber ich am Ende entweder:
invalid indirect of worker literal (type worker)
oder:
cannot use wrk (type worker) as type *worker in return argument
Irgendwelche Ideen auf, wie dies zu tun?
InformationsquelleAutor Johan | 2016-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
&
immer bedeutet "nehmen Sie die Adresse" (mit Ausnahme der binären bitweisen operator-version).*
allerdings ändert sich die Bedeutung, je nach Kontext. Der Ausdruck*Type
bedeutet "Zeiger auf Type". Die express*Pointer
bedeutet "das Objekt, das Zeiger". Dies ist, warum Sie bekommen eineinvalid indirect of worker literal
wenn Sie versuchen, verwenden Sie den Ausdruck*wrk
, weil du sagst "geben Sie mir das Objekt, daswrk
Punkte", aberwrk
ist kein Zeiger.Als solche müssen Sie
*worker
da Ihr Rückgabetyp (Rückgabe einen Zeiger auf einen Arbeiter), und Sie kehren zurück&wrk
die Adresse der Struktur, die Sie zurückgeben.Eine andere alternative ist die integrierte
new()
zu erstellen, die einen Zeiger auf den ersten Platz:Alles, was gesagt, gibt es wenig Grund zur Rückgabe einen Zeiger auf Ihren Mitarbeiter-Struktur hier. Die Struktur selbst hat nur zwei Felder, die beide schon Referenz-Typen (strings sind im wesentlichen nur unveränderlich Scheiben), so dass die gesamte Struktur ist nur 5 Maschine Wörter lang (also 20 oder 40 bytes, je nachdem, ob Sie 32bit oder 64bit). Sie sind sich nicht ändern die Struktur, nach der Rückkehr, und die version, die Sie speichern in der Unternehmens-Struktur wird auch eine Kopie (Unternehmen hält eine Scheibe von Arbeitnehmern, nicht eine Scheibe von Zeigern auf die Arbeitnehmer).
tmp/sandbox713099900/main.go:20: cannot use wrk (type *worker) as type worker in append tmp/sandbox713099900/main.go:21: cannot use wrk (type *worker) as type worker in return argument
Yep, aus einer Art in die zweite, mein schlechtes. Jedoch, wenn Sie wollen in der Lage sein, um Sie zu aktualisieren innerhalb von main, Ihr Stück in die Struktur der Firma zu sein, muss der Typ
[]*worker
eine Scheibe von Zeigern, und Sie müssen, fügen Sie die Adresse des Arbeiters (alsoappend(cmp.Workers, &wrk)
für die erste version undappend(cmp.Workers, wrk)
für die zweite version, die verwendetnew()
), so ist die Firma Scheibe ist, verweisen auf die gleichen Arbeiter, die Sie der Rückkehr aus der Funktion über die Adresse.Beispiel mit Unternehmen mit einer Scheibe Zeiger, zeigen, es wird tatsächlich ein update-in-place: play.golang.org/p/XAV1365jer
Vielen Dank! Ich glaube, ich verstehe 😉
InformationsquelleAutor Kaedys