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

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

王林
王林ke hadapan
2024-02-05 11:49:271122semak imbas

确定 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
}

Tandatangan kaedah Lawatan adalah seperti berikut

Visit(tree antlr.ParseTree) interface{}

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)

Keluaran adalah seperti berikut:

TYPE -> exec.DataType                   
VALUE -> 5

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")
}

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
        }
}

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
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam