У меня есть перечисление в прото-файле, который генерирует целочисленные константы в файле pb.go. Теперь у меня есть целые числа, исходящие из внешнего источника данных, и вы хотите безопасно сопоставить их с возможными константами.Перейти: передовая практика для безопасного преобразования целых чисел в значения перечисления буфера протокола
Вот что я в настоящее время: https://play.golang.org/p/-5VZqPbukd
package main
import (
"errors"
"fmt"
)
//enum in the proto file
//
// enum X {
// A = 0;
// B = 1;
// C = 2;
// D = 3;
// }
//enum type generated by protoc
type X int32
//enum constants generated by protoc
const (
X_A X = 0
X_B X = 1
X_C X = 2
X_D X = 3
)
func intToX(v int) (X, error) {
x := X(v)
switch x {
case X_A, X_B, X_C, X_D:
return x, nil
}
return 0, errors.New("could not convert int to X")
}
func main() {
for i := -1; i < 10; i++ {
if x, err := intToX(i); err != nil {
fmt.Println("unhandled error:", err, "for input value", i)
} else {
fmt.Printf("%d => X(%d)\n", i, x)
}
}
}
Вопрос: Есть ли лучший, более идиоматический способ отображения входящих целые значений для protoc сгенерированных констант?
В частности, я хотел бы избежать перечисления всех констант явно в инструкции case A, B, C, D
.
Да! Я также нашел карту 'X_name' и использую' if _, ok: = X_name [int32 (v)]; ok {return X (v), nil} 'для проверки значений. Btw. если вы хотите получить кредит за этот ответ, вы должны придерживаться примера. И вы уверены в своем утверждении 'found, _'. Думаю, вам нужно написать '_, found' здесь. – Juve