Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengakses Medan Struktur Tanpa Nama yang Diluluskan sebagai `antara muka{}` di Golang?

Bagaimana untuk Mengakses Medan Struktur Tanpa Nama yang Diluluskan sebagai `antara muka{}` di Golang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-03 22:05:30895semak imbas

How to Access Fields of an Anonymous Struct Passed as `interface{}` in Golang?

Mengakses Struktur Tanpa Nama yang Diluluskan sebagai Antara Muka{} di Golang

Dalam Go, adalah mungkin untuk menentukan antara muka tanpa kaedah menggunakan sintaks antara muka{}. Walau bagaimanapun, bekerja dengan jenis yang melaksanakan antara muka sedemikian boleh menimbulkan cabaran, terutamanya apabila cuba mengakses medan struct tanpa nama.

Pertimbangkan contoh berikut di mana anda ingin menghantar struct tanpa nama sebagai parameter kepada fungsi:

<code class="go">package main

import (
    "fmt"
    "log"
    "time"
)

type job struct {
    name    string
    action  func()
    custom  interface{}
}

func NewJob(t string, name string, c func(), v interface{}) {
    job := process(t)
    job.name = name
    job.action = c
    job.custom = v

    go func() {
        for {
            job.action()
            time.Sleep(2 * time.Second)
        }
    }()
}

func Custom(name string) interface{} {
    for _, j := range jobs {
        if j.name != name {
            continue
        }
        return j.custom
    }
    return nil
}

func main() {
    NewJob("every 2 second", "pene", func() {
        t := Custom("pene")
        log.Println(t)
    }, struct {
        ID int
    }{
        1,
    })
}</code>

Dalam contoh ini, fungsi NewJob mengambil parameter jenis antara muka{} yang dipanggil v. Di dalam fungsi, anda menetapkan medan tersuai struct kerja kepada v. Anda kemudian melancarkan kerja dengan goroutine yang melaksanakan fungsi yang disediakan setiap dua saat. Dalam goroutine, anda mendapatkan semula medan tersuai menggunakan fungsi Tersuai dan cuba mengakses medan ID struktur tanpa nama. Walau bagaimanapun, anda akan menghadapi ralat:

t.ID undefined (type interface {} is interface with no methods)

Ini kerana jenis antara muka{} tidak mempunyai sebarang kaedah, jadi anda tidak boleh mengakses medan jenis asas secara langsung. Untuk menyelesaikan masalah ini, anda mesti terlebih dahulu "menaip menegaskan" antara muka kepada jenis yang sesuai sebelum anda boleh mengakses medannya. Dalam kes ini, anda tahu jenis asas ialah struct tanpa nama {ID int}, jadi anda boleh menaip menegaskannya seperti berikut:

<code class="go">id := v.(struct{ID int}).ID</code>

Dengan menaip menegaskan v kepada jenis struct yang betul, anda kini boleh mengakses medan ID seperti yang dijangkakan.

Atas ialah kandungan terperinci Bagaimana untuk Mengakses Medan Struktur Tanpa Nama yang Diluluskan sebagai `antara muka{}` di Golang?. 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