получить значение из указателя на float32 из структуры? - PullRequest
0 голосов
/ 26 мая 2018

Я извлекаю некоторые данные из базы данных - и у меня есть указатель на float32 - потому что, если я использую указатель - тогда я могу проверить, равен ли он нулю (что довольно часто может быть).

Когда это не ноль, я хочу получить значение - как мне разыменовать его, чтобы я мог получить фактический float32?Я не могу найти ссылку для этого нигде!Я точно знаю, что я хочу сделать, и я просто не могу найти синтаксис в Go, с которым я все еще очень плохо знаком - вся помощь приветствуется.

Я знаю, как разыменовать указатель, если онпрямой float32 ...

но если у меня есть следующая структура ...

type MyAwesomeType struct{
    Value *float32
}

Затем, после того как я сделаю:

if myAwesomeType.Value == nil{
    // Handle the error later, I don't care about this yet...
} else{
    /* What do I do here? Normally if it were a straight float32
     * pointer, you might just do &ptr or whatever, but I am so
     * confused about how to get this out of my struct...
    */
}

1 Ответ

0 голосов
/ 26 мая 2018

Спецификация языка программирования Go

Операторы адреса

Для операнда x типа указателя * T, косвенность указателя* x обозначает переменную типа T, на которую указывает x.Если x равен nil, попытка оценить * x вызовет панику во время выполнения.


Используйте оператор *.Например,

package main

import "fmt"

type MyAwesomeType struct {
    Value *float32
}

func main() {
    pi := float32(3.14159)
    myAwesomeType := MyAwesomeType{Value: &pi}

    if myAwesomeType.Value == nil {
        // Handle the error
    } else {
        value := *myAwesomeType.Value
        fmt.Println(value)
    }
}

Детская площадка: https://play.golang.org/p/8URumKoVl_t

Вывод:

3.14159

Так как вы новичок в Go, возьмите A TourГо .Тур объясняет многое, в том числе указатели.

Указатели

В Go есть указатели.Указатель содержит адрес памяти значения.

Тип *T является указателем на значение T.Его нулевое значение равно nil.

var p *int

Оператор & создает указатель на свой операнд.

i := 42
p = &i

Оператор * обозначает базовое значение указателя.

fmt.Println(*p) // read i through the pointer p
*p = 21         // set i through the pointer p

Это известно как "разыменование" или "косвенное".

В отличие от C, Go не имеет арифметики указателей.

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