Как преобразовать типы данных * uint64 и * uint32 в тип данных int? - PullRequest
0 голосов
/ 12 марта 2020

В моем случае у меня есть 2 переменные с типами данных *uint64 и *uint32. Мне нужно преобразовать их в тип данных int.

Когда я пытаюсь преобразовать их с помощью функции int(), возникает такая ошибка:

Невозможно преобразовать выражение введите * uint64, чтобы ввести int.

Я заметил, что та же самая функция int() работает без проблем, если типы данных не имеют * (asterisk) символа.

Так что мой вопрос Как правильно преобразовать типы данных *uint64 и *uint32 в тип данных int?!

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Вы не можете (не должны) конвертировать указатель в int, что вы, скорее всего, захотите сделать, это преобразовать указанное значение в int.

Так что просто разыменуйте указатель, чтобы получить uint64 и uint32 значение, которое вы можете конвертировать:

var i *uint64 = new(uint64)
var j *uint32 = new(uint32)
*i = 1
*j = 2

var k, l int
k = int(*i)
l = int(*j)

fmt.Println(k, l)

Это выводит (попробуйте на Go Playground ):

1 2

Обратите внимание, что, конечно, если указатель nil, попытка разыменовать его (например, *i) приводит к пани времени выполнения c.

Также обратите внимание, что размер (и, следовательно, действительный Диапазон) int зависит от платформы, он может быть 64- и 32-битным. Таким образом, преобразование любого значения uint64 в int может потерять старшие 32 бита, а некоторые положительные входные числа могут превратиться в отрицательные.

0 голосов
/ 12 марта 2020

[H] теперь правильно преобразовывает типы данных * uint64 и * uint32 в тип данных int?!

Вот так

var a = int64(123)
var pa *uint64 = &a
var i = int(uintptr(unsafe.Pointer(&a)))

Но учтите, что пока это «самый правильный способ» конвертировать * uint64 в int, но это почти наверняка не , что вы хотите сделать. Что вы должны сделать: Изучите язык и его систему типов и попытайтесь понять, какие значения указателя.

(Обратите внимание на «самый правильный», поскольку не существует правильных способов сделать то, что вы спросил.)

...