如何将双指针字符串转换为字符串?
在这个例子中我们可以直接传递字符串参数。但我的应用程序中有双指针字符串到字符串要求。
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(s)
}
答案 0 :(得分:3)
如果你不能避免使用**string
,那就是你可以处理它的方法:从**string
值断言interface{}
(因为这是它包含的内容),然后取消引用指针,该指针为您提供*string
,您再次可以取消引用该指针,为您提供string
值。
func main() {
s := "ss"
a := &s
fmt.Println("Before a:", *a)
Modify(&a)
fmt.Println("After a:", *a)
fmt.Println("After s:", s)
}
func Modify(s interface{}) {
sp := s.(**string)
**sp = "modified"
}
输出(在Go Playground上尝试):
Before a: ss
After a: modified
After s: modified
但要知道,如果您已经有*string
类型的变量(a
),那么您不需要接受并传递其地址,您可以按原样传递(*string
值:
func main() {
s := "ss"
a := &s
fmt.Println("Before a:", *a)
Modify(a)
fmt.Println("After a:", *a)
fmt.Println("After s:", s)
}
func Modify(s interface{}) {
sp := s.(*string)
*sp = "modified"
}
再次输出(在Go Playground上尝试):
Before a: ss
After a: modified
After s: modified
注意,在这两种情况下,a
指向的值都更改为"modified"
,但s
的值也发生了变化。这是因为在Modify()
内我们修改了尖头值。如果您只想更改a
(更具体地说是a
指向的值),但您不想更改s
,那么在Modify()
内您应该只修改sp
指向的值,它将是变量a
,但不是指向尖头的值(s
)。为了只更改指向值,您必须为其指定类型为*string
的值:
func main() {
s := "ss"
a := &s
fmt.Println("Before a:", *a)
Modify(&a)
fmt.Println("After a:", *a)
fmt.Println("After s:", s)
}
func Modify(s interface{}) {
sp := s.(**string)
newValue := "modified"
*sp = &newValue
}
这次输出将是(在Go Playground上尝试):
Before a: ss
After a: modified
After s: ss
如您所见,Modify()
修改了a
指向的值,但s
保持不变。
答案 1 :(得分:1)
您需要断言**string
以获取interface{}
附近的基础值。然后使用double
指针取消引用字符串的值。
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(**s.(**string))
}