Einen Int-Zeiger auf einen Int-Wert in Go setzen
In Go besteht eine häufige Aufgabe darin, einem Int-Zeiger einen Wert zuzuweisen. Ein kürzlich entdeckter Fehler in einem Codeausschnitt wirft jedoch Licht auf eine mögliche Falle:
package main import ( "fmt" "reflect" ) func main() { var guess *int fmt.Println(reflect.TypeOf(guess)) *guess = 12345 fmt.Println(guess) }
Beim Ausführen dieses Codes tritt der folgende Fehler auf:
Type: *int panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x483c7d] goroutine 1 [running]: main.main() /home/aaron/projects/gopath/src/github.com/AaronNBrock/go-guess/main.go:16 +0x9d exit status 2
Die Ursache liegt in die Tatsache, dass die Zeigerschätzung zunächst auf Null gesetzt ist. Das Dereferenzieren eines Nullzeigers löst einen Laufzeitfehler aus, wie in der Fehlermeldung zu sehen ist. Die Lösung besteht darin, dem Zeiger Speicher zuzuweisen, bevor versucht wird, ihm einen Wert zuzuweisen:
var guess *int guess = new(int) *guess = 12345
Diese Modifikation stellt sicher, dass Guess auf einen gültigen Speicherort verweist, sodass wir seinen Wert festlegen und abrufen können.
Alternativ kann die Verwendung einer kurzen Variablendeklaration den Code vereinfachen:
guess := new(int) *guess = 12345
Ein anderer Ansatz besteht darin, die Adresse einer vorhandenen Variablen dem zuzuweisen Zeiger:
value := 12345 // will be of type int guess := &value
Diese Lösung verweist auf eine vorhandene Variable, anstatt neuen Speicher zuzuweisen. Durch das Ändern des Zeigerwerts wird auch der Wert der ursprünglichen Variablen geändert.
Bedenken Sie abschließend, dass das Zeigen eines Zeigers auf eine Position und das Zuweisen eines Werts zu dieser unterschiedliche Vorgänge sind. Ersteres weist Speicher zu oder setzt den Zeiger auf eine vorhandene Variable, während letzteres den an der angegebenen Stelle gespeicherten Wert ändert.
Das obige ist der detaillierte Inhalt vonWie weist man einem Int-Zeiger in Go einen Wert korrekt zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!