更改类型后获取地址

时间:2019-04-15 14:18:11

标签: go

我是Go语言的新手,我正在尝试从开发人员的角度寻找一种方便的方法,以在更改类型后获取对象的地址。

考虑这两种新类型:

type specialString string
type nestedStruct struct {
    name *specialString
}

我发现用于填充nestedStruct的规范方法是:

str := "James"
specStr := specialString(str)
nested := nestedStruct{
    name: &specStr,
}

是否有一种方法可以忽略specStr的声明,该声明仅在一个地方使用?我试过了,但是会触发语法错误(这是什么逻辑原因?):

//Syntax error
nested := nestedStruct{
    name: &specialString(str),
}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您不能采用任意操作的地址,包括类型转换。有关详细信息,请参见How can I store reference to the result of an operation in Go?;和Find address of constant in go

如果转换字符串文字,则可以省略局部变量之一:

specStr := specialString("James")
nested := nestedStruct{
    name: &specStr,
}

如果您已经具有string类型的变量,并且想要省略第二个变量(specialString类型的变量),则获取现有string变量的地址,然后进行转换它发送到*specialString

str := "James"
nested = nestedStruct{
    name: (*specialString)(&str),
}

Go Playground上尝试这些示例。

如果要忽略局部变量,请参见以下答案以获取选项:How do I do a literal *int64 in Go?

答案 1 :(得分:1)

使用函数在初始化时消除样板:

func specialStringPtr(s string) *specialString { 
     return (*specialString)(&s) 
}


nested := nestedStruct{
    name: specialStringPtr(str),
}