Определение типа и преобразование интерфейса - PullRequest
0 голосов
/ 20 ноября 2019

Я опробовал следующий код:

package main

import (
    "fmt"
    "sync"
)

type T string

func main() {
    var a sync.Map // map[interface{}]interface{}
    var c T
    // a.Store("a", T("A"))
    a.Store("a", "A")
    b, _ := a.Load("a")
    c = b.(T)
    fmt.Println(c)
}

Получается ошибка panic: interface conversion: interface {} is string, not main.T. Тем не менее, это работает, если я использую закомментированную строку.

Разве T и string не имеют тех же базовых типов? Что за этим стоит?

1 Ответ

1 голос
/ 20 ноября 2019

Сохраняет string на карте:

a.Store("a", "A")

Загружает значение с карты, но возвращает интерфейс, указывающий на значение, вставленное выше, то есть string:

b, _ := a.Load("a")

Это проверит, является ли b T:

c = b.(T)

Но b - string, поэтому утверждение не выполняется.

Если вы сделаете:

a.Store("a",T("A"))

, тогда утверждение должно сработать, потому что тип значения на карте теперь T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...