panic:接口转换:interface {}是**字符串,不是字符串

时间:2018-04-14 08:03:17

标签: string pointers go interface

如何将双指针字符串转换为字符串?

在这个例子中我们可以直接传递字符串参数。但我的应用程序中有双指针字符串到字符串要求。

package main

import (
    "fmt"
)

func main() {
    s := "ss"
    a := &s
    Modify(&a)
}

func Modify(s interface{}) {
    fmt.Println(s)

}

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

2 个答案:

答案 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))
}

Playground