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.
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
.
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!