Как проверить, являются ли доступ / методы вложенных указателей недопустимыми во время выполнения - PullRequest
0 голосов
/ 24 февраля 2020

Допустим, у меня есть структура Go, которая выглядит примерно так (пожалуйста, простите синтаксис для объяснения):

type Foo struct {
    MyBar *Bar
}

type Bar struct {
    value int
}

func (b* Bar) Bark() {
    fmt.Printf("Hello I'm a bar with value: %v", b.value)
}

Теперь, допустим, что эта структура Foo хранится в памяти для процесса, и для заполнения поля MyBar требуется некоторое время. Как в, это nil на некоторое время. Можно ли как-нибудь проверить, сохраняется ли его сохранение для доступа к методу Bark() во время выполнения, без выполнения nil проверок вручную?

Например, что-то вроде:

// Early on, this happens:
f := &Foo{}
.
.
.
.
// And later, I wanna see if its safe to do:
if isSafe(b.MyBar) {
   b.MyBar.Bar()
}

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

1 Ответ

4 голосов
/ 24 февраля 2020

Нет ярлыка для глубокой проверки структуры для нулевых указателей. Ваш isSafe по сути является нулевой проверкой:

if b.MyBar!=nil {
  b.MyBar.Bark()
}

В качестве альтернативы, вы также можете проверить нулевой приемник в методе:

func (b* Bar) Bark() {
    if b!=nil {
       fmt.Printf("Hello I'm a bar with value: %v", b.value)
    }
}

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

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