Rumah > pembangunan bahagian belakang > Golang > Mengapakah Mengubah Suai Jenis Mudah Melalui Kaedah Penerima Penunjuk di Go Tidak Berfungsi Seperti Yang Dijangkakan?

Mengapakah Mengubah Suai Jenis Mudah Melalui Kaedah Penerima Penunjuk di Go Tidak Berfungsi Seperti Yang Dijangkakan?

Patricia Arquette
Lepaskan: 2024-11-16 12:29:03
asal
237 orang telah melayarinya

Why Does Modifying a Simple Type Through a Pointer Receiver Method in Go Not Work as Expected?

Cara Mengubah Suai Nilai Jenis Mudah melalui Kaedah Penerima Penunjuk dalam Go

Apabila bekerja dengan jenis tersuai berdasarkan jenis asas, anda mungkin mahu untuk mengubah suai nilai mereka menggunakan fungsi penerima penunjuk. Walau bagaimanapun, apabila anda cuba berbuat demikian, anda mungkin menghadapi senario di mana perubahan kelihatan tidak berkesan. Berikut ialah penjelasan terperinci:

Isunya

Pertimbangkan kod berikut:

package main

import "fmt"

type FooInt int

func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp // Attempting to modify the pointer
}

func main() {
    var fi *FooInt
    fi.FromString("5")
    fmt.Println(fi) // Prints nil
}
Salin selepas log masuk

Apabila anda menjalankan program ini, anda akan perasan bahawa nilai fi kekal sifar walaupun kaedah FromString cuba berubah ia.

Penjelasan

Dalam Go, semua hujah fungsi—termasuk penerima—dilalui mengikut nilai. Ini bermakna di dalam kaedah FromString, penuding fi ialah salinan penuding sebenar yang diisytiharkan dalam main. Apabila anda mengubah suai fi dalam kaedah, anda hanya mengubah suai salinan, bukan penunjuk asal.

Untuk menyelesaikan isu ini, anda mempunyai dua pilihan:

1. Kembalikan Penuding Diubahsuai

Anda boleh mengembalikan penuding yang diubah suai daripada kaedah FromString dan berikannya kembali kepada penuding asal:

func (fi *FooInt) FromString(i string) *FooInt {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    return &tmp
}

func main() {
    var fi *FooInt
    fi = fi.FromString("5")
    fmt.Println(fi) // Prints the address of the modified pointer
}
Salin selepas log masuk

2. Pastikan Penerima Bukan Sifar

Sebagai alternatif, anda boleh memastikan bahawa penerima tidak sifar sebelum cuba mengubah suai nilai yang ditunjuk:

func (fi *FooInt) FromString(i string) {
    if fi == nil {
        fi = new(FooInt) // Initialize fi if it's nil
    }
    num, _ := strconv.Atoi(i)
    *fi = FooInt(num)
}

func main() {
    var fi *FooInt
    fi.FromString("5")
    fmt.Println(fi) // Prints the address of the modified pointer
}
Salin selepas log masuk

Ini memastikan penerima adalah dimulakan dan nilai yang ditunjuk boleh diubah suai secara langsung.

Ringkasnya, apabila mengubah suai nilai melalui penunjuk kaedah penerima dalam Go, ingat bahawa penerima adalah salinan dan anda mesti sama ada mengembalikan penunjuk yang diubah suai atau memastikan bahawa penerima adalah tidak sifar untuk mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapakah Mengubah Suai Jenis Mudah Melalui Kaedah Penerima Penunjuk di Go Tidak Berfungsi Seperti Yang Dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan