Wenn ich mir manchmal den Go-Code anderer Leute ansehe, stelle ich fest, dass einige von ihnen Zeiger im Code verwenden und andere nicht. (Empfohlenes Lernen: go)
Angenommen, es gibt einen Strukturtyp namens Person und es wird festgestellt, dass einige Methoden func methodA (*person Person) als Parameter verwenden, oder use func *( person Person) methodA() wird als eigene Methode der Struktur verwendet, dh die Personenstruktur kann MethodeA direkt aufrufen, jedoch mit einem Zeiger.
Oder Sie können die Verwendung von var personMap map[string]*Person in der Kartenstruktur sehen
Wenn Sie von Java nach Golang wechseln, ist es möglicherweise nicht leicht zu verstehen. Da es in der Java-Welt keinen Zeiger gibt, können Sie ihn einfach direkt übergeben und verwenden. Beim Wechseln zu Golang müssen Sie jedoch auf viele Dinge achten.
Wann sollten Sie es also verwenden? Warum wird es an manchen Orten benötigt?
Wenn Sie keine Zeiger verwenden, ist es in einigen Fällen unmöglich, der Struktur Werte zuzuweisen. Dieser Code verwendet keine Zeiger und definiert ihn eine Reihe von Objekten zum Testen
rrreeDann schreibe ich die Hauptmethode. Ich werde die gedruckten Ergebnisse im Code kommentieren. Sie können feststellen, dass die Zuweisung in vielen Fällen fehlschlägt.
type Person struct { //person结构体,包含年龄,名称,车 age int name string car Car } type Car struct { //person名下的车 name string //车的名字 } var personMap map[string]Person //一个存放person的map func setName(person Person, name string) { //给参数person设置名字 person.name = name } func (person Person) setName(name string) { //设置名字 person.name = name } func printName(person Person){ //打印person的名字 fmt.Println(person.name) } func (person Person)printName(){ //结构体person自己支持打印名字 fmt.Println(person.name) }
Als nächstes ändern Sie es, um Zeiger zu verwenden
func main() { person := Person{} fmt.Println(person) //{0 {}} person.age = 12 person.name = "小明" person.car = Car{"宝马"} fmt.Println(person) //{12 小明 {宝马}},正常赋值给person变量,因为这是在方法里面的变量 setName(person, "小红") fmt.Println(person) //{12 小明 {宝马}},小红赋值失败,传递给setName方法的person没有赋值成功 person.setName("小红") fmt.Println(person) //{12 小明 {宝马}},person自己setName,还是失败 personMap = make(map[string]Person) personMap["test"] = person person = personMap["test"] person.name = "小红" fmt.Println(person) //{12 小红 {宝马}},从map中取出person,给小红赋值成功 for _, value := range personMap { //遍历map fmt.Println(value)//{12 小明 {宝马}},打印的还是小明,而不是小红,说明上面personMap["test"]对象赋值失败 } }
Ändern Sie die Hauptmethode und verwenden Sie das Adresszeichen &
type Person struct { age int name string car Car } type Car struct { name string } var personMap map[string]*Person func setName(person *Person, name string) { person.name = name } func (person *Person) setName(name string) { person.name = name } func printName(person Person){ fmt.Println(person.name) } func (person Person)printName(){ fmt.Println(person.name) }
Wir kommen also zu dem Schluss, dass, wenn wir den Variableninhalt der Struktur ändern müssen, die von der Methode übergebenen Strukturvariablenparameter Zeiger verwenden müssen , das heißt, wenn die Adresse der Struktur geändert werden muss Die Variablen der Architektur in der Karte müssen auch die Strukturadresse als Wert der Karte verwenden
Wenn Sie nur die Strukturvariable lesen, können Sie die Referenz direkt ohne Verwendung des Zeigers übergeben
*type Die Typvariable speichert hier eine Adresse. Dies muss klar sein. Sie müssen &type verwenden, um die Adresse zu erhalten.
Das obige ist der detaillierte Inhalt vonKann Golang keine Zeiger verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!