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