Rumah > pembangunan bahagian belakang > Golang > Bagaimana Menggunakan Berbilang Kes dengan Betul dalam Suis Jenis Go untuk Mengelakkan Ralat Kaedah?

Bagaimana Menggunakan Berbilang Kes dengan Betul dalam Suis Jenis Go untuk Mengelakkan Ralat Kaedah?

Barbara Streisand
Lepaskan: 2024-12-18 10:37:10
asal
202 orang telah melayarinya

How to Correctly Use Multiple Cases in Go's Type Switch to Avoid Method Errors?

Suis Jenis dengan Berbilang Kes

Dalam Go, pernyataan suis jenis boleh digunakan untuk memilih kes yang sepadan secara dinamik berdasarkan jenis suatu nilai. Apabila berbilang jenis ditentukan dalam satu kes, ralat mungkin dibangkitkan jika jenis nilai tidak sepadan dengan mana-mana jenis yang disenaraikan.

Pertimbangkan coretan kod berikut:

package main

import (
    "fmt"
)

type A struct {
    a int
}

func(this *A) test(){
    fmt.Println(this)
}

type B struct {
    A
}

func main() {
    var foo interface{}
    foo = A{}
    switch a := foo.(type){
        case B, A:
            a.test()
    }
}
Salin selepas log masuk

Apabila kod ini dijalankan, ia menghasilkan ralat berikut:

a.test undefined (type interface {} is interface with no methods)
Salin selepas log masuk

Ralat ini menunjukkan bahawa suis jenis tidak berkuat kuasa kerana pembolehubah a mempunyai antara muka jenis{}, yang tidak mempunyai kaedah test().

Spesifikasi bahasa Go menerangkan bahawa dalam pernyataan suis jenis, apabila berbilang jenis ditentukan dalam kes, pembolehubah diisytiharkan dalam kes itu akan mempunyai jenis ungkapan dalam pengawal suis jenis (dalam kes ini, foo). Memandangkan foo adalah jenis antara muka{}, a juga menjadi jenis antara muka{}.

Untuk menyelesaikan isu ini dan memastikan bahawa kaedah test() boleh dipanggil, anda boleh secara eksplisit menegaskan bahawa foo mempunyai ujian( ) kaedah sebelum melakukan suis jenis, seperti:

package main

import (
    "fmt"
)

type A struct {
    a int
}

func (this *A) test() {
    fmt.Println(this)
}

type B struct {
    A
}

type tester interface {
    test()
}

func main() {
    var foo interface{}
    foo = &B{}
    if a, ok := foo.(tester); ok {
        fmt.Println("foo has test() method")
        a.test()
    }
}
Salin selepas log masuk

Dengan menegaskan bahawa foo mempunyai kaedah test(), anda boleh mendapatkan nilai jenis yang sesuai dan panggil kaedah test() berjaya.

Atas ialah kandungan terperinci Bagaimana Menggunakan Berbilang Kes dengan Betul dalam Suis Jenis Go untuk Mengelakkan Ralat Kaedah?. 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