Введите утверждение для данных JSON

Типы данных в 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)
}

Этот вопрос похож на: Невозможно использовать утверждение типа для значения параметра типа. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему. (детская площадка).

Brits 27.08.2024 02:03
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправьте это, изменив объявление функции на func Input_fields(required map[string]string, target map[string]any) { ... }.

Удаление параметра типа из объявления функции не приведет к потере общности. Вопрос утверждает и показывает, что значение target является результатом демаршалинга JSON. Тип any — единственный тип интерфейса, поддерживаемый unmarshal. Нет смысла использовать Input_fields, если значение карты не является интерфейсным типом. Отсюда следует, что единственным полезным типом параметра типа является any, поэтому просто объявите его с помощью этого конкретного типа.

Другие вопросы по теме