Поиск в WeChat【Жареная рыба с мозгами] Обратите внимание на эту жареную рыбу с печенью. эта статьяGitHub GitHub.com/Vicious Genetics/Нет...В комплекте с моей серией статей, материалов и книг по Go с открытым исходным кодом.
Всем привет, я жареная рыба.
Некоторое время назад, когда я как сумасшедший писал код, один читатель вдруг задал мне вопрос, который меня заинтересовал:
Мне всё-таки больше интересно, потому что это продакшн-окружение, там есть код, и вся группа в замешательстве.
Выслушав мнение друзей, поделюсь сегодня.Всем тоже стоит задуматься о причинах и избежать этой "ямы" вместе.
Дело номер один
Пример кода выглядит следующим образом:
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, чтобы призвать больше.