неверный адрес памяти в Голанге - PullRequest
0 голосов
/ 20 ноября 2018

Я проверил несколько других ответов, и они дали мне хорошие мысли о том, как решить эту проблему, но я все еще не могу понять это.

    localID := generateGenericID("local") // type int64
    localName := "local" // type string

    // set them to pointers as I need them as type *int64 and *string
    plocalID := &localID
    plocalName := &localName

    // create a pointer to a new github org
    var org *github.Organization

    // create a new general purpose org
    o := Org{}

    // Check for nil, per several other answers
    if plocalName != nil {
        o.Name = plocalName
        org.Login = plocalName // ERROR
    }

    if plocalID != nil {
        o.ID = plocalID
        org.ID = plocalID
    }

   fmt.Println(*plocalName) // prints local


    hunt.addOrganization(org) // takes a pointer to a github org
    report.addReportOrganization(&o) // take a pointer to an org

Полученное сообщение об ошибке:

panic: runtime error: invalid memory address or nil pointer 

Указывает на строку, помеченную ERROR.Ошибка не имеет смысла из-за того, что я проверяю nil, поэтому мне интересно, возможно, я являюсь каким-то адским указателем из-за создания переменной, которая является указателем, а затем присвоения ей указателей.

Должен ли я простосоздайте github org как обычную структуру и затем передайте &org функции поиска.Я попробовал это и обошел ошибку, но кучу других кодов вырвало, поэтому, прежде чем я начну преследовать это, я решил спросить, имеет ли это смысл, если я смотрю в неправильном месте.RTFM со ссылками всегда приветствуется.

Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Ваш код делает это по существу:

var org *github.Organization
org.Login = plocalName

org - нулевой указатель, он не указывает на значение, поэтому org.Login пытается отменить ссылку на нулевой указатель - следовательно,ошибка.Поэтому не объявляйте org типом указателя.

У вас также есть много ненужного кода, имеющего дело с указателями, например,

plocalID := &localID
..
if plocalID != nil {
    o.ID = plocalID
    org.ID = plocalID
}

В первой строке, которую вы создали plocalIDи инициализировал его с &localID.В таком случае plocalID не может быть нулевым указателем, поэтому не имеет смысла проверять if plocalID != nil {.Вы можете просто избавиться от plocalID и написать свой код как

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