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
DDDasal
2024-12-07 05:15:16435semak imbas

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
}

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
}

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:
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