Saya baru kenal golang dan cuba memahami pointer.
type TreeNode struct { Val int Left *TreeNode Right *TreeNode } queue:=[]TreeNode{TreeNode{}} node:=TreeNode{Val: 1} pre:=queue[len(queue)-1] pre.Left = &node
Tetapi saya dapati baris gilir itu[0].Kiri masih tiada
type TreeNode struct { Val int Left *TreeNode Right *TreeNode } queue:=[]*TreeNode{&TreeNode{}} node:=&TreeNode{Val: 1} pre := queue[len(queue)-1] pre.Left = node
Barisan kali ini[0].Kiri bukan nol
Bolehkah seseorang membantu saya memahami mengapa ini berlaku?
Alangkah baiknya jika anda boleh menerangkannya pada tahap ingatan.
Contohnya: Kami mempunyai kepingan TreeNode pada 0x1001 Jadi apa yang disimpan dalam alamat? Dan cara kepingan itu dipautkan kepada A TreeNode, sebagai contoh, alamat 0x3001Inilah yang berlaku dalam sekeping kod pertama:
queue:=[]TreeNode{TreeNode{}} node:=TreeNode{Val: 1} // Copy last element of slice to local variable pre pre:=queue[len(queue)-1] // Assign field in local variable pre. The slice element is // not modified. pre.Left = &node
Ini klip kedua:
queue:=[]*TreeNode{&TreeNode{}} node:=&TreeNode{Val: 1} // Copy last element of queue to local variable pre. // pre and the last element of queue have the same pointer // value (it was just copied) and point at the same node. pre := queue[len(queue)-1] // Set the left field in the node that pre points to. queue[0] // also points at this node. // This code is syntactic sugar for (*pre).Left = node. pre.Left = node
Untuk membetulkan contoh pertama, ubah suai elemen hirisan dan bukannya pra pembolehubah setempat. Satu cara ialah menggunakan penunjuk untuk menghiris elemen.
queue:=[]TreeNode{TreeNode{}} node:=TreeNode{Val: 1} // Variable pre is pointer to last element in slice. pre:= &queue[len(queue)-1] // Set the left field in the node that pre points to. This // is the same value as queue[0]. pre.Left = &node
Atas ialah kandungan terperinci Bagaimana untuk memahami struktur menghiris dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!