У вас есть переменная-указатель, которая после объявления будет nil
.
Если вы хотите установить указанное значение, оно должно указывать на что-то.Попытка разыменования указателя nil
- это паника во время выполнения, именно то, что вы испытали.Вы можете использовать встроенную функцию new()
для получения указателя на int
с нулевым значением, а затем вы можете установить указанное значение:
var guess *int
guess = new(int)
*guess = 12345
Ваше измененное приложение:
var guess *int
fmt.Println(guess)
guess = new(int)
*guess = 12345
fmt.Println(guess, *guess)
Вывод (попробуйте на Go Playground ):
<nil>
0x10414028 12345
Обратите внимание, что вы можете сделать это короче, используя краткое объявление переменной вот так:
guess := new(int)
*guess = 12345
Другой вариант сделать указатель на что-то «полезное» - это присвоить адрес переменной переменной-указателю, например:
value := 12345 // will be of type int
guess := &value
Но это решение изменяет значение указателя, а не указанное значение.Результат такой же, хотя в этом простом примере.
Вы также можете просто назначить адрес другой переменной, а затем перейти к изменению указанного значения:
var value int
guess := &value
*guess = 12345
Также обратите внимание, что сguess
указывает на value
, изменение указанного значения также изменит значение переменной value
.Кроме того, если вы измените переменную value
напрямую, то указанное значение на guess
также изменится: они одинаковы:
var value int
guess := &value
value = 12345
fmt.Println(*guess) // This will also print 12345
Попробуйте это на Go Playground .