Kann Golang keine Zeiger verwenden?

(*-*)浩
Freigeben: 2019-12-17 14:26:06
Original
3363 Leute haben es durchsucht

Kann Golang keine Zeiger verwenden?

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

rrree

Dann 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)
}
Nach dem Login kopieren

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"]对象赋值失败
    }
}
Nach dem Login kopieren

Ä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)
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!