代码之家  ›  专栏  ›  技术社区  ›  Marcin Nabiałek

将自定义类型强制转换为基本类型指针

  •  1
  • Marcin Nabiałek  · 技术社区  · 2 年前

    假设我有这样的代码:

    type CustomStringType string
    
    var a *CustomStringType
    
    x := CustomStringType("sample string")
    a = &x
    
    
    var b *string
    
    

    并且我不能修改上面代码中的任何内容。

    现在我想分配 a b

    我尝试了多种方法,比如:

    b = a
    b = string(a)
    b = a.(string)
    b = a.(*string)
    
    

    但它们都不起作用。

    1 回复  |  直到 2 年前
        1
  •  2
  •   icza    2 年前

    使用简单类型 conversion :

    b = (*string)(a)
    

    明确的 转换是形式的一种表达 T(x) 哪里 T 是一种类型并且 x 是一个可以转换为类型的表达式 T .

    由于要转换为的类型以 * 运算符,它必须加括号以避免歧义(例如,您想转换为 *string ,而不是 string 并取消引用结果)。

    (*string)(a) 是有效的转换,因为您要从类型转换值 *CustomStringType *字符串 ,规范允许使用以下规则进行这种转换:

    一个非常数值 x 可以转换为类型 T 在任何一种情况下:

    • [...]
    • 忽略结构标记(见下文), x 的类型和 T 是不是的指针类型 named types ,以及它们的指针基类型不是类型参数,而是具有相同的底层类型。

    二者都 *自定义字符串类型 *字符串 是未命名的指针类型,并且两者都具有 一串 作为它们的指针基类型。

        2
  •  0
  •   Thang Tran    2 年前

    您可以使用 conversion 来自go.dev文档:

    Conversion=Type“(”Expression[“,”]“)”

    但让我们看看这张纸条

    如果类型以运算符*或<-开始,或者,如果类型以关键字func开头,并且没有结果列表,则必须在必要时将其加括号以避免歧义:

    因此,解决方案可以是:

    b = (*string)(a)