Типы данных в JSON немного ограничены, и все числовые типы анализируются как float34
Я не хочу сканировать данные JSON в структуру
В функции Input_fields
я хочу проверить входящие данные JSON.
недопустимая операция: невозможно использовать утверждение типа для значения параметра типа v (переменная типа V, ограниченная любым)
https://go.dev/play/p/U8QOwZUePti
package main
import (
"fmt"
"math"
"github.com/go-json-experiment/json"
)
type (
request_body map[string]any
)
func Input_fields[V any](required map[string]string, target map[string]V) {
for k, v := range target {
if required_type, ok := required[k]; ok {
t := fmt.Sprintf("%T", v)
fmt.Println(k, v, t)
switch required_type {
case "int":
if t == "float64" {
int_val := math.Trunc(v.(flaot64))
fmt.Println("int:", int_val)
} else {
// Invalid data type
}
}
} else {
// Invalid field
}
}
}
func main() {
// Get some JSON data an unmarshal it
var input request_body
b := []byte(`{"field1":123}`)
if err := json.Unmarshal(b, &input); err != nil {
}
required := map[string]string{
"field1": "int",
}
Input_fields(required, input)
}
Исправьте это, изменив объявление функции на func Input_fields(required map[string]string, target map[string]any) { ... }
.
Удаление параметра типа из объявления функции не приведет к потере общности. Вопрос утверждает и показывает, что значение target
является результатом демаршалинга JSON. Тип any
— единственный тип интерфейса, поддерживаемый unmarshal. Нет смысла использовать Input_fields
, если значение карты не является интерфейсным типом. Отсюда следует, что единственным полезным типом параметра типа является any
, поэтому просто объявите его с помощью этого конкретного типа.
Этот вопрос похож на: Невозможно использовать утверждение типа для значения параметра типа. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему. (детская площадка).