В производственной среде возникла проблема с Go, и вся группа была ошеломлена...

задняя часть Go

Поиск в WeChat【Жареная рыба с мозгами] Обратите внимание на эту жареную рыбу с печенью. эта статьяGitHub GitHub.com/Vicious Genetics/Нет...В комплекте с моей серией статей, материалов и книг по Go с открытым исходным кодом.

Всем привет, я жареная рыба.

Некоторое время назад, когда я как сумасшедший писал код, один читатель вдруг задал мне вопрос, который меня заинтересовал:

image.png

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

Выслушав мнение друзей, поделюсь сегодня.Всем тоже стоит задуматься о причинах и избежать этой "ямы" вместе.

Дело номер один

Пример кода выглядит следующим образом:

type MyErr struct {
    Msg string
}

func main() {
    var e error
    e = GetErr()
    log.Println(e == nil)
}

func GetErr() *MyErr {
    return nil
}

func (m *MyErr) Error() string {
    return "脑子进煎鱼了"
}

Пожалуйста, подумайте об этом,Что выдает эта программа?

вызывается программойGetErrТо, что возвращает метод,nil, а внешнее суждениеe == nil, так что окончательный вывод верен, верно?

Результат выглядит следующим образом:

2021/04/04 08:39:04 false

Ответ: ложь.

Случай 2

Пример кода выглядит следующим образом:

type Base interface {
    do()
}

type App struct {
}

func main() {
    var base Base
    base = GetApp()
    
    log.Println(base)
    log.Println(base == nil)
}

func GetApp() *App {
    return nil
}
func (a *App) do() {}

Пожалуйста, подумайте об этом,Что выдает эта программа?

Программа вызываетGetAppметод, который возвращаетnil, поэтому он назначенbaseСлишкомnil. Поэтому судитеbase == nilКонечный результат<nil>а такжеtrue,Это правильно?

Результат выглядит следующим образом:

2021/04/04 08:59:00 <nil>
2021/04/04 08:59:00 false

ответ:<nil>и ложный.

Почему

Почему, что происходит с этими двумя программами Go... так нелогично? Причина этого, по сути, заключается в понимании основных принципов интерфейсов в языке Go.

В одном случае, хотяGetErrметод возвращаетnil, тип возвращаемого значения также является конкретным*MyErrТипы. Но переменная, которую он получает, не является конкретным типом структуры, аerrorТипы:

var e error
e = GetErr()

На языке Го,errorТипы по сути являются интерфейсами:

type error interface {
    Error() string
}

Итак, возвращаясь к проблеме типа интерфейса, интерфейс — это не простое значение, ана типы и значения.

Так что этот ноль в традиционном познании не есть тот ноль,Нулевое суждение интерфейса будет верным только в том случае, если и тип, и значение равны нулю..

В случае 1, в сочетании с логикой кода, то, что больше соответствует сцене:

var e *MyErr
e = GetErr()
log.Println(e == nil)

Вывод будет верным.

В случае 2 результат тот же, причина тоже в интерфейсе. не важно какerrorИнтерфейс по-прежнему кастомный, принцип тот же, и результат, естественно, тот же.

Суммировать

Сегодняшняя статья равносильна деформации «Вопросы для собеседования в Go: «Яма» и принципиальный анализ интерфейса Go», ведь это трансформация кода производственной среды, более подходящая для реальной актуальной сцены.

Подсознательная интуиция иногда не совсем верна, нам нужно правильно понять эти точки знаний в языке Go, чтобы лучше понять идеал и видение ухода с работы пораньше.

Если у вас есть какие-либо вопросы, пожалуйста, оставьте отзыв и обменяйтесь мнениями в области комментариев.Лучшие отношения - это достигать друг друга, твойподобното естьжареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.

Статья постоянно обновляется, вы можете выполнить поиск [рыба, жареная в мозгу] на WeChat, чтобы прочитать, ответить [000] Готовые мной решения и материалы по вопросам алгоритма заводского собеседования первой линии, эта статьяGitHub GitHub.com/Vicious Genetics/Нет...Он был включен, добро пожаловать в Star, чтобы призвать больше.