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

Mary-Kate Olsen
Lepaskan: 2024-11-03 22:05:30
asal
815 orang telah melayarinya

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>
Salin selepas log masuk

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)
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!