下面的代码
package main
import "strings"
import "fmt"
type Foo string
const (
Bar Foo = "bar"
Snafu = "snafu"
Foobar = "foobar"
)
var Foos = []Foo{Bar, Snafu, Foobar}
func main() {
fmt.Println("Foos: " + strings.Join(Foos, ","))
}
Run Code Online (Sandbox Code Playgroud)
产生这个错误:
./test.go:17: cannot use Foos (type []Foo) as type []string in argument to strings.Join
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为 Foo 不是字符串,而是从字符串派生的。有没有办法在不复制的情况下将“[]Foo”强制为“[]string”?
几乎最好也是唯一的方法是循环遍历 Foo 对象的切片,如下所示(导致复制):
func main() {
results := make([]string, 0, len(Foos))
for _, r := range Foos{
results = append(results, string(r))
}
fmt.Println("Foos: " + strings.Join(results, ","))
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,目前 Go 不支持概念类型强制并且需要副本。作为替代方案,您可以输入别名 []Foo 并向其添加 Stringer 方法,从而封装此类详细信息,如下所示:http://play.golang.org/p/FuOoLNrCvD
有关类似问题,请参阅以下内容:Cannot conversion []string to []interface {}