Адреса операторов Голанга и (* int) (Type) синтаксис - PullRequest
0 голосов
/ 11 июля 2019

Начинал поиграться с golang и искал кастом json.Unmarshal.В сообщении блога было следующее:

type FlexInt int

func (fi *FlexInt) UnmarshalJSON(data []byte) error {
    if data[0] != '"' {
        return json.Unmarshal(data, (*int)(fi))
    }
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }
    i, err := strconv.Atoi(s)
    if err != nil {
        return err
    }
    *fi = FlexInt(i)
    return nil
}

И я понимаю, что он делает, но я не понимаю (*int)(fi) часть.Если посмотреть на значение указателя fi, оно совпадает с (*int)(fi) - (*int)(fi) == fi.Тем не менее, когда я изменяю эту строку просто на fi, она делает бесконечный цикл

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Это тот же указатель, но с другим типом.Когда json.Unmarshal вызывается с interface{}, который содержит FlexInt*, он вызывает FlexInt UnmarshalJSON метод.Когда он вызывается с interface{}, который содержит int*, он использует встроенное поведение.Поскольку FlexInt и int имеют один и тот же базовый тип, допустимо преобразовывать указатель на один в указатель на другой, но это "фактический" тип, которым интерфейс будет помечен.

2 голосов
/ 11 июля 2019

Выражение преобразует fi в *int.Результат содержит тот же адрес, но имеет другой тип.

Если *FlexInt передается json.Unmarshal, то json.Unmarshal вызовет метод *FlexInt.UnmarshalJSON, который вызывает json.Unmarshal и т. Д..

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