Паника при печати нулевой ошибки в структуре - PullRequest
0 голосов
/ 25 января 2019

Следующий код будет паниковать при печати нулевого значения поля типа ошибки в структуре. Почему?

package main

import (
    "fmt"
)

type ta struct {
    int
}

type tb struct {
    int
    *ta
}

type tc struct {
    int
    error
}

type td struct {
    int
    error interface{}
}

func main() {
    fmt.Println(fmt.Sprintf("%v", ta{1}))
    fmt.Println(fmt.Sprintf("%v", tb{1, nil}))
    fmt.Println(fmt.Sprintf("%v", tc{1, nil}))
    fmt.Println(fmt.Sprintf("%v", td{1, nil}))
}
▸ go run main.go
{1}
{1 <nil>}
%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)
{1 <nil>}

https://play.golang.org/p/SrzUsJ3pyRC

Следующий вопрос: если у меня есть такое значение tc{1, nil}, как его распечатать, не вызывая паники?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В tc вы встраиваете значение типа error.Sprintf видит, что tc реализует error (из-за встраивания), и пытается вызвать для него Error(), что вызывает ошибку, поскольку значение равно nil.

Если вы хотитераспечатайте его, не вызывая паники, не вставляйте error (поместите его в именованное поле) или убедитесь, что встроенное значение error не равно nil.

0 голосов
/ 25 января 2019

Не знаю почему, но, похоже, это все исправляет ...

type tc struct {
    Num int
    Err error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...