我是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),
}
任何帮助将不胜感激。
答案 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),
}