Rumah >pembangunan bahagian belakang >Golang >Cara menyelesaikan ralat golang: tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y', strategi penyelesaian

Cara menyelesaikan ralat golang: tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y', strategi penyelesaian

PHPz
PHPzasal
2023-08-20 16:30:331399semak imbas

如何解决golang报错:cannot refer to unexported name 'x' in package 'y',解决策略

Cara menyelesaikan ralat golang: "tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y'

Semasa proses pembangunan menggunakan golang, kita mungkin menghadapi ralat sedemikian: "tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y'", ralat ini disebabkan terutamanya apabila kami mengakses pembolehubah atau fungsi yang tidak dieksport.

Dalam golang, kes huruf pertama pembolehubah dan nama fungsi menentukan keterlihatan mereka. Pengecam boleh dieksport jika huruf pertamanya ialah huruf besar jika huruf pertamanya ialah huruf kecil, ia tidak boleh dieksport. Pembolehubah atau fungsi yang tidak boleh dieksport hanya boleh diakses dalam pakej yang sama dan tidak boleh diakses secara langsung oleh pakej lain. Apabila kami cuba mengakses pembolehubah atau fungsi yang tidak dieksport dalam pakej lain, ralat di atas akan berlaku.

Jadi, bagaimana untuk menyelesaikan masalah ini? Berikut adalah beberapa strategi penyelesaian:

  1. Tukar pembolehubah atau fungsi untuk dieksport: Jika kita perlu mengakses pembolehubah atau fungsi dalam pakej lain, maka kita boleh menukar huruf pertamanya kepada huruf besar supaya ia boleh dieksport . Sebagai contoh, jika kita mempunyai pembolehubah bernama "x" yang tidak boleh diakses di luar pakej, kita boleh menukarnya kepada "X".

Contoh kod:

package y

var x string // 不可导出的变量

func foo() {
    // 不可导出的函数
}

Kod diubah suai:

package y

var X string // 可导出的变量

func Foo() {
    // 可导出的函数
}
  1. Akses dalam pakej yang sama: Jika kita tidak boleh menukar pembolehubah atau fungsi untuk dieksport, tetapi perlu menggunakannya dalam pakej lain, kita boleh menggunakannya dalam fungsi A disediakan di dalam pakej yang sama untuk mengakses pembolehubah atau fungsi ini secara tidak langsung. Dengan cara ini, pakej lain boleh mendapatkan hasil yang diperlukan dengan memanggil fungsi ini.

Contoh kod:

package y

var x string // 不可导出的变量

func getX() string {
    return x
}

Panggil pakej lain:

package main

import (
    "fmt"
    "package/y"
)

func main() {
    x := y.getX()
    fmt.Println(x)
}
  1. Gunakan antara muka untuk menyembunyikan butiran pelaksanaan: Jika terdapat beberapa jenis peribadi dalam pakej (huruf pertama adalah huruf kecil), tetapi kami berharap pakej lain hanya boleh panggil awam apabila digunakan Kaedah boleh merangkum jenis peribadi ini sebagai antara muka dan mendedahkan antara muka ini secara umum. Dengan cara ini, pakej lain hanya boleh mengakses jenis ini melalui antara muka, tetapi tidak boleh mengakses secara langsung kaedah atau sifat peribadi objek pelaksanaannya.

Contoh kod:

package y

type privateType struct {
    data int
}

func (p *privateType) privateMethod() {
    fmt.Println(p.data)
}

type PublicInterface interface {
    PublicMethod()
}

func CreatePrivateType() PublicInterface {
    return &privateType{}
}

func (p *privateType) PublicMethod() {
    p.privateMethod()
}

Digunakan dalam pakej lain:

package main

import (
    "package/y"
)

func main() {
    p := y.CreatePrivateType()
    p.PublicMethod() // 可以调用
    p.privateMethod() // 无法调用,报错
}

Melalui penyelesaian di atas, kita boleh menyelesaikan ralat golang: "tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y'". Memilih strategi yang sesuai mengikut situasi tertentu boleh menjadikan kod kami lebih mudah dibaca, diselenggara dan meningkatkan kebolehgunaan semula kod.

Atas ialah kandungan terperinci Cara menyelesaikan ralat golang: tidak boleh merujuk kepada nama 'x' yang tidak dieksport dalam pakej 'y', strategi penyelesaian. 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