String 死机:接口转换:接口{}是**字符串,不是字符串
如何将双指针字符串转换为字符串 在本例中,我们可以直接传递字符串参数。但我的应用程序中有双指针字符串到字符串的要求String 死机:接口转换:接口{}是**字符串,不是字符串,string,pointers,go,interface,String,Pointers,Go,Interface,如何将双指针字符串转换为字符串 在本例中,我们可以直接传递字符串参数。但我的应用程序中有双指针字符串到字符串的要求 package main import ( "fmt" ) func main() { s := "ss" a := &s Modify(&a) } func Modify(s interface{}) { fmt.Println(s) } 操场:如果您无法避免使用**字符串,您可以这样处理:从接口{}值断言**字符
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(s)
}
操场:如果您无法避免使用
**字符串
,您可以这样处理:从接口{}
值断言**字符串
(因为这是它所包含的),然后取消对指针的引用,该指针为*字符串
,您可以再次取消对该指针的引用,该指针为字符串
值
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"
}
输出(在上尝试):
但是要知道,如果您已经有一个*string
类型的变量(即a
),您不需要获取并传递它的地址,您可以按原样传递它(a*string
值):
再次输出将是(在上尝试):
注意在这两种情况下,a
所指的值都变为“已修改”
,但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
}
这一次输出将是(在上尝试):
正如您所看到的,Modify()
修改了a
所指的值,但是s
保持不变。您需要断言**string
以获得围绕接口{}
的基础值。然后使用double
指针取消对字符串值的引用
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(**s.(**string))
}
Before a: ss
After a: modified
After s: modified
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
}
Before a: ss
After a: modified
After s: ss
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(**s.(**string))
}