Установите для int Pointer значение int Golang - PullRequest
0 голосов
/ 13 июня 2018

Я очень новичок в Go и пытаюсь установить *int для указания числа, скажем 12345.

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var guess *int
    fmt.Println(reflect.TypeOf(guess))
    *guess = 12345
    fmt.Println(guess)
}

Но это выдает мне следующую ошибку:

Type: *int
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x483c7d]

goroutine 1 [running]:
main.main()
    /home/aaron/projects/gopath/src/github.com/AaronNBrock/go-guess/main.go:16 +0x9d
exit status 2

Я вижу, что ошибка связана с *guess = 12345, начиная с 12345, но я не уверен, что ее вызывает.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

У вас есть переменная-указатель, которая после объявления будет 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 .

0 голосов
/ 15 апреля 2019

FWIW, если вы делаете это достаточно часто (например, настраиваете данные в модульных тестах), полезно иметь сокращение, следовательно:

https://github.com/mwielbut/pointy

val := 42
pointerToVal := &val
// vs.
pointerToVal := pointy.Int(42)
0 голосов
/ 13 июня 2018

Если вы действительно хотите указатель на int, а не просто на int, тогда вам нужна переменная для хранения int, на который вы указываете.Например:

var guess *int
a := 12345
guess = &a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...