【问题标题】:How convert *uint64 and *uint32 data types to the int data type?如何将 *uint64 和 *uint32 数据类型转换为 int 数据类型?
【发布时间】:2020-06-24 09:06:43
【问题描述】:

就我而言,我有 2 个数据类型为 *uint64*uint32 的变量。我需要将它们转换为int 数据类型。

当我尝试使用int() 函数转换它们时,它会引发这样的错误:

无法将 *uint64 类型的表达式转换为 int 类型。

我注意到,如果数据类型没有 * (asterisk) 字符,相同的 int() 函数可以正常工作。

所以我的问题是如何正确地将*uint64*uint32 数据类型转换为int 数据类型?!

【问题讨论】:

  • 注意没有int()函数。 T(x) 形式的表达式“其中T 是一个类型,x 是一个表达式”称为显式 conversion

标签: pointers go types type-conversion


【解决方案1】:

您不能(不应该)将指针转换为int,您最可能想要做的是将指向的值转换为int

因此,只需取消引用指针即可获得 uint64uint32 值,您可以对其进行转换:

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)会导致运行时恐慌。

还要注意int 的大小(以及有效范围)取决于平台,它可能是64 位和32 位。因此将任何uint64 值转换为int 可能会丢失高32 位,并且某些正输入数可能会变成负数。

【讨论】:

    【解决方案2】:

    [H]如何正确地将 *uint64 和 *uint32 数据类型转换为 int 数据类型?!

    这样

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

    但请注意,虽然这是将 *uint64 转换为 int 的“最正确方法”,但几乎可以肯定 不是您想要做的。你应该做什么:学习语言及其类型系统,并尝试理解指针值是什么。

    (请注意“最正确的”,因为 没有正确的方法可以按照您的要求进行操作。)

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2016-06-25
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多