恐慌:接口转换:接口{}是**字符串,而不是字符串

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)

游乐场:https://play.golang.org/p/d4hrG9LzLNO

icz*_*cza 5

如果您无法避免使用 a **string,则可以这样处理它:**stringinterface{}值断言(因为这是它包含的内容),然后取消引用指针,该指针为您提供了该指针,*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)

再次输出将是(在Go Playground上尝试):

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保持不变。