在golang中将[]*string转换为[]string

4
我是一个新手,正在学习Go语言。我有一个函数需要接收[]string类型的输入,但实际上我要传递的是[]*string类型的输入,该如何将[]*string转换为[]string呢?是否有任何工具可以帮助转换,或者我必须使用for循环迭代并构建一个数组来完成转换?Playground链接:https://play.golang.org/p/_s2g7-IfGAy
package main

import (
    "fmt"
)

func main() {
    //Declaring an array of []*string and assigning value to it
    var a [1]*string
    var strPointer = new(string)
    *strPointer = "1"
    a[0] = strPointer
    fmt.Println(*a[0])
    // accept(a) this wont work

    //Converting to array []string
    var b []string
    for i := range a {
        b = append(b, *a[i])
    }
    accept(b)// this works

    fmt.Println(b)

}

func accept(param []string) {
    fmt.Println("Works!")
}

2
你为什么要在首位操作字符串指针? - jub0bs
是的,您可以使用for循环。如果您需要在多个地方执行此操作,请将该循环放入一个函数中。 - JimB
这只是一个例子,我知道该字段是自动生成的,因此它是 []*string 类型,并且我必须将其传递给另一个也是自动生成的函数,该函数接受 []string 类型。 - BLACKMAMBA
2个回答

6

您的accept(param []string)函数期望一个字符串切片。

var a [1]*string这声明了一个长度为1的 Go 数组,因此它不是一个切片。

您可以使用以下代码声明一个空的字符串指针切片:var a []*string

然后您需要遍历数组,并使用指针元素的值创建一个切片,并使用该切片调用accept函数。

以下是将*[]string类型转换为[]string类型的示例函数:

func stringer(str []*string) []string{
    var strs []string
    for _, s := range str {
        if s == nil {
            strs = append(strs, "")
            continue
        }
        strs = append(strs, *s)
    }

    return strs
}

点击这里运行


5
为了减少重新分配,可以进行一项小的优化。 - rustyx

2
如何将 []*string 转换为 []string?
在 Go 中,不可能进行此类类型转换。
是否有任何工具可以使用来转换它?
在 SO 上问第三方库/工具/包是不合适的。
还是必须使用 for 循环迭代它并构造一个数组?
这是唯一干净、正常且符合惯用语法的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接