Как я могу преобразовать интерфейс {} в sql.NullString, используя отражение или иным образом

Я создал интерфейс карты[string]{} и заполнил его как таковой.

sli := make(map[string]interface{})

    str := new(sql.NullString)

    str.String = "hello"
    str.Valid = true

    i64 := new(sql.NullInt64)

    i64.Int64 = 55
    i64.Valid = true

    sli["first"] = str
    sli["second"] = i64

Все это прекрасно заполняется, но когда я пытаюсь получить доступ к строке из элемента sql.NullString на карте, у меня возникает паника.

interface conversion: interface {} is *sql.NullString, not sql.NullString

Вот код, который я использую для доступа к строке...

temp := sli["first"]
    temptype := reflect.TypeOf(temp).String()
    if temptype == "*sql.NullString" {
        s := sql.NullString{}
        s = temp.(sql.NullString)
        s2 := s.String
        fmt.Print(s2)
    }

Я попытался изменить тип на sql.Nullstring, как было предложено в ошибке, но тогда он не видит условие if как истинное.

Кто-нибудь знает, почему за это проголосовали, я отредактировал, чтобы использовать правильный пакет?

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

Ответы 1

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

new() создает нулевой указатель на запрошенный тип. Поэтому ожидается, что вы создаете *sql.NullString, а не sql.NullString. Ваши варианты:

  1. Преобразуйте его правильно для типа:

    s = temp.(*sql.NullString)
    
  2. Не создавайте указатель:

    str := sql.NullString{}
    
    str.String = "hello"
    str.Valid = true
    

    который можно сократить до:

    str := sql.NullString{
        String: "hello",
        Valid:  true,
    }
    

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