Rumah > pembangunan bahagian belakang > Golang > Mengapakah Saya Perlu Mengelak Menggunakan Penunjuk pada Nilai Antara Muka Apabila Kaedah Memanggil dalam Go?

Mengapakah Saya Perlu Mengelak Menggunakan Penunjuk pada Nilai Antara Muka Apabila Kaedah Memanggil dalam Go?

DDD
Lepaskan: 2024-12-07 05:15:16
asal
442 orang telah melayarinya

Why Should I Avoid Using Pointers to Interface Values When Calling Methods in Go?

Kaedah Memanggil pada Penunjuk Antara Muka dalam Go

Dalam Go, anda mungkin menghadapi keperluan untuk memprogramkan antara muka dan menggunakan transaksi tanpa mengubah suai anda kod. Pendekatan biasa ialah menghantar penuding kepada "objek" ke dalam sifat medan untuk membolehkan pemulangan semula jika perlu. Walau bagaimanapun, pendekatan ini boleh menyebabkan kekeliruan.

Mari kita pertimbangkan contoh kod:

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp *gorp.SqlExecutor // Pointer to SqlExecutor
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key) // Call method on pointer
    if err != nil {
        panic(err)
    }
    return obj
}
Salin selepas log masuk

Di sini, anda mungkin percaya bahawa anda memerlukan penuding kepada "objek" Gorp untuk melakukan pemutaran semula. Walau bagaimanapun, adalah penting untuk memahami beberapa konsep utama dalam Go:

  • Penunjuk ke Antara Muka: Anda tidak akan sekali-kali menggunakan penuding kepada nilai antara muka dalam Go. Antara muka disarikan, jenis nilai.
  • Panggilan mengikut Nilai: Dalam Go, semua hujah fungsi dihantar mengikut nilai. Ini termasuk penunjuk.
  • Mengubah Suai Nilai: Apabila anda menghantar penuding kepada struct atau jenis lain, anda boleh mengubah suai nilai asal. Walau bagaimanapun, ini tidak berlaku dengan penuding kepada antara muka.

Dalam kod contoh, walaupun anda mempunyai penuding kepada Gorp SqlExecutor, anda tidak dapat memanggil kaedah pada penuding antara muka itu sendiri. Anda sebaliknya memanggil kaedah pada nilai asas. Dalam kes ini, nilai asas ialah struct SqlExecutor.

Oleh itu, anda boleh mengalih keluar penuding dengan selamat daripada struct Repository dan hanya menghantar antara muka SqlExecutor ke Repository:

package repositories

import (
    "github.com/coopernurse/gorp"
)

type Repository struct {
    Gorp gorp.SqlExecutor // Pointer removed
}

func (r *Repository) GetById(i interface{}, key interface{}) interface{} {
    obj, err := r.Gorp.Get(i, key)
    if err != nil {
        panic(err)
    }
    return obj
}
Salin selepas log masuk

Ini kod akan berfungsi seperti yang diharapkan dan membolehkan anda menggunakan transaksi tanpa mengubah suai SqlExecutor yang mendasari. Anda tidak perlu risau tentang menghantar penunjuk kepada antara muka dalam konteks ini.

Atas ialah kandungan terperinci Mengapakah Saya Perlu Mengelak Menggunakan Penunjuk pada Nilai Antara Muka Apabila Kaedah Memanggil dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan