Rumah > pembangunan bahagian belakang > Golang > Tentukan jenis nilai antara muka {} yang dikembalikan oleh fungsi dalam Golang

Tentukan jenis nilai antara muka {} yang dikembalikan oleh fungsi dalam Golang

王林
Lepaskan: 2024-02-05 11:49:27
ke hadapan
1148 orang telah melayarinya

确定 Golang 中函数返回的接口 {} 值的类型

Kandungan soalan

Saya mempunyai fungsi yang mengembalikan nilai daripada enum. Penghitungan ditakrifkan seperti berikut:

type DataType int64

const (
    INT DataType = iota
    FLOAT
    STRING
    BOOL
    CHAR
    VOID
    ERROR
    BREAK
    CONTINUE
)

    func (l *TSwiftVisitor) VisitWhileInstr(ctx *parser.WhileInstrContext) interface{} {        
    if condExpression.ValType == BOOL {             
        condResult := condExpression.asBool()       
        for condResult {            
            for _, currentInstr := range ctx.InstrList().AllInstr() {
                execResult := l.Visit(currentInstr)
                fmt.Printf("TYPE -> %T\n", execResult) // Prints exec.DataType (the type)
                fmt.Printf("VALUE -> %v\n", execResult) // Prints 5 (the enum value)
                if execResult == BREAK { // This never executes
                    fmt.Println("Es break")
                    return VOID
                } else { // This executes
                    fmt.Println("Es otra mierda")
                }
            }           
            condResult = l.Visit(ctx.Expr()).(*Expression).asBool()
        }       
    } else {
        return ERROR
    }
    return VOID
}
Salin selepas log masuk

Tandatangan kaedah Lawatan adalah seperti berikut

Visit(tree antlr.ParseTree) interface{}
Salin selepas log masuk

Selepas memanggil kaedah, saya menerima nilai jenis DataType dan mencetak jenis dan nilai pulangan dalam baris berikut.

fmt.Printf("TYPE -> %T\n", execResult) // Prints exec.DataType (the type)
fmt.Printf("VALUE -> %v\n", execResult) // Prints 5 (the enum value)
Salin selepas log masuk

Keluaran adalah seperti berikut:

TYPE -> exec.DataType                   
VALUE -> 5
Salin selepas log masuk

Setakat ini bagus, tetapi saya perlu membuat perbandingan dan itulah masalah yang saya ada, yang saya tidak tahu tentang Golang. Saya mempunyai perkara berikut:

if execResult == BREAK { // This never executes
    fmt.Println("It's a break")
    return VOID
} else { // This executes
    fmt.Println("It's another thing")
}
Salin selepas log masuk

Di sinilah saya tidak tahu bagaimana untuk meneruskan dengan mengesahkan jenis pulangan, jika saya mencuba baris berikut saya tidak pernah melaksanakan kod yang saya mahu, yang dalam kes ini adalah untuk mengembalikan VOID. Soalan saya ialah bagaimana untuk membandingkan jenis pulangan untuk melakukan tindakan tertentu berdasarkan hasilnya. Saya juga mencuba perkara berikut:

switch execResult.(type) {
    case DataType:
        if execResult.(DataType) == BREAK {

            return execResult
        }
}
Salin selepas log masuk

Dalam kes ini, keadaan di dalam suis juga tidak berpuas hati. Soalan saya pada asasnya ialah bagaimana untuk menentukan jenis nilai antara muka{} yang dikembalikan daripada panggilan fungsi.


Jawapan betul


Saya rasa @Charlie Tumahai betul: masalahnya ialah ketidakpadanan dalam nilai. Saya mencuba contoh kecil di Go Playground dan ia berfungsi seperti yang diharapkan: jika perbandingan DataType 是从 Visit 返回,然后与 DataType boleh menjadi benar.

Jenis yang dikembalikan mestilah menjadi DataType 类型。 Visit2 方法演示了这一点:它返回一个 int64,它永远不会等于 BREAK.

Ini diterangkan dalam

Go Spesifikasi Bahasa Pengaturcaraan di bawah Operator Perbandingan:

package main

import "fmt"

type DataType int64

const (
    INT DataType = iota
    BREAK
    CONTINUE
)

func Visit() interface{} { return BREAK }
func Visit2() interface{} {return int64(BREAK) }

func main() {
    for _, x := range []interface{}{Visit(), Visit2()} {
        fmt.Printf("x = %v, T(x) = %T : ", x, x)
        if x == BREAK {
            fmt.Println("x is BREAK")
        } else {
            fmt.Println("Cannot identify x")
        }
    }

    // Output:
    // x = 1, T(x) = main.DataType : x is BREAK
    // x = 1, T(x) = int64 : Cannot identify x
}
Salin selepas log masuk

Atas ialah kandungan terperinci Tentukan jenis nilai antara muka {} yang dikembalikan oleh fungsi dalam Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan