Heim >
Backend-Entwicklung >
Golang >
Was ist []*T in der groß angelegten Verwirrungsszene? *[]Was ist T? *[]*TWas ist das?
Was ist []*T in der groß angelegten Verwirrungsszene? *[]Was ist T? *[]*TWas ist das?
醉折花枝作酒筹
Freigeben: 2021-08-02 09:21:21
nach vorne
3209 Leute haben es durchsucht
Kürzlich habe ich einen sehr seltsamen Code gesehen, darunter „[]*T“, „*[]T“ und „*[]*T“. Auf den ersten Blick sehen sie alle gleich aus, aber wenn wir genau hinschauen, erkennen wir Wir finden, dass sie unterschiedlich sind. Heute stellen wir Golongs „[]*T“, „*[]T“ und „*[]*T“ vor, um die Unterschiede zwischen ihnen zu verstehen. Werfen wir einen Blick darauf. Schauen wir uns als Neuling in der Go-Sprache um Sie werden neugierig sein, wenn Sie einen „seltsamen“ Code sehen; der Pseudocode ist zum Beispiel wie folgt:
Ich glaube, dass die meisten Anfänger, die gerade mit Go begonnen haben, verwirrt sein werden, wenn sie solchen sehen Code, und das Verwirrendste ist, worüber die Leute verwirrt sind:
[]*T
*[]T
*[]*T
Nach dem Login kopieren
Für eine solche Deklaration von Slices schauen wir uns nicht die letzten beiden Schreibweisen an; es ist leicht zu verstehen, wenn man sich []*T allein ansieht : Die Speicheradressen aller T werden in diesem Slice gespeichert, was besser ist als das Speichern von T selbst und mehr Platz spart. Gleichzeitig kann []*T den Wert von T innerhalb der Methode ändern, aber []T kann nicht.
func TestSaveSlice(t *testing.T) {
a := []T{{Name: "1"}, {Name: "2"}}
for _, t2 := range a {
fmt.Println(t2)
}
_ = SaveB(a)
for _, t2 := range a {
fmt.Println(t2)
}
}
func SaveB(data []T) error {
t := data[0]
t.Name = "1233"
return nil
}
type T struct {
Name string
}
Sie können feststellen, dass sich die Verwendung der Append-Funktion zum Anhängen von Daten auf die Außenseite auswirkt, wenn Sie den Zeiger des Slice übergeben. Slice-PrinzipBevor wir die oben genannten drei Situationen analysieren, wollen wir zunächst die Datenstruktur von Slice verstehen. Wenn Sie sich den Quellcode direkt ansehen, werden Sie feststellen, dass es sich bei Slice tatsächlich um eine Struktur handelt, auf die jedoch nicht direkt zugegriffen werden kann. Quellcode-Adresse runtime/slice.goEs gibt drei wichtige Attribute:
Attribut
Bedeutung
Array
Das zugrunde liegende Array, das Daten speichert, ist ein Zeiger.
最终在 appendC 中的 x 的指针指向了扩容后的结构体,因为传递的是 main 函数中 x 的指针,所以同样的 main 函数中的 x 也指向了该结构体。
总结
所以总结一下:
切片是对数组的抽象,同时切片本身也是一个结构体。
参数传递时函数内部与外部引用的是同一个数组,所以对切片的修改会影响到函数外部。
如果发生扩容,情况会发生变化,同时扩容会导致数据拷贝;所以要尽量预估切片大小,避免数据拷贝。
Bei der Neugenerierung von Slices oder Arrays beeinflussen sich die Daten gegenseitig, da sie dasselbe zugrunde liegende Array verwenden. Dies muss beachtet werden.
Slices können auch Zeiger übergeben, aber es gibt nur wenige Szenarien, die zu unnötigen Missverständnissen führen. Es wird empfohlen, Werte nur nach Wert zu übergeben, da Länge und Kapazität nicht viel Speicher beanspruchen.
Wenn Sie Slicing verwendet haben, werden Sie feststellen, dass es ArrayList in Java sehr ähnlich ist und auch Daten erweitert und kopiert für die obere Schicht, und einige gemeinsame zugrunde liegende Implementierungen sind allen ähnlich.
Wenn wir uns zu diesem Zeitpunkt []*T *[]T *[]*T im Titel ansehen, werden wir feststellen, dass diese nicht miteinander verwandt sind, aber sie sehen sehr ähnlich aus und es ist leicht, Leute zu täuschen.
Wenn Sie es brauchen, können Sie sich das golongTutorial
ansehen
Das obige ist der detaillierte Inhalt vonWas ist []*T in der groß angelegten Verwirrungsszene? *[]Was ist T? *[]*TWas ist das?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn