Kum*_*iva 2 string pointers interface go
如何将双指针字符串转换为字符串?
在这个例子中我们可以直接传递字符串参数。但我的应用程序中有双指针字符串到字符串的要求。
package main
import (
"fmt"
)
func main() {
s := "ss"
a := &s
Modify(&a)
}
func Modify(s interface{}) {
fmt.Println(s)
}
Run Code Online (Sandbox Code Playgroud)
如果您无法避免使用 a **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"
}
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
Before a: ss
After a: modified
After s: modified
Run Code Online (Sandbox Code Playgroud)
但要知道,如果您已经有一个*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"
}
Run Code Online (Sandbox Code Playgroud)
Before a: ss
After a: modified
After s: modified
Run Code Online (Sandbox Code Playgroud)
请注意,在这两种情况下, 指向的值都a更改为"modified",但 的值s也发生了更改。这是因为里面Modify()我们修改了pointed指向的值。如果您只想a更改(更具体地说是 指向的值a)但不想更改s,那么在内部Modify()您应该只修改 指向的值sp,这将是变量a,而不是所指向的值(即s)。为了仅更改指向的值,您必须*string为其分配一个 type 值:
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
}
Run Code Online (Sandbox Code Playgroud)
这次的输出将是(在Go Playground上尝试一下):
Before a: ss
After a: modified
After s: ss
Run Code Online (Sandbox Code Playgroud)
可以看到,Modify()修改了 指向的值a,但s保持不变。