首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法将[]字符串转换为[]接口{}

无法将[]字符串转换为[]接口{}
EN

Stack Overflow用户
提问于 2012-10-21 00:19:25
回答 7查看 56.6K关注 0票数 105

我正在编写一些代码,我需要它来捕获参数并通过fmt.Println传递它们

(我希望它的默认行为是用空格分隔参数,然后换行)。然而,它接受[]interface {},但flag.Args()返回一个[]string

下面是代码示例:

package main

import (
    "fmt"
    "flag"
)

func main() {
    flag.Parse()
    fmt.Println(flag.Args()...)
}

这将返回以下错误:

./example.go:10: cannot use args (type []string) as type []interface {} in function argument

这是一个bug吗?fmt.Println不应该给带任何数组吗?顺便说一下,我也尝试过这样做:

var args = []interface{}(flag.Args())

但我得到以下错误:

cannot convert flag.Args() (type []string) to type []interface {}

有没有一种"Go“的方法来解决这个问题?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-21 00:42:52

这不是一个bug。fmt.Println()需要[]interface{}类型。这意味着,它必须是interface{}值的切片,而不是“任何切片”。为了转换切片,您需要循环并复制每个元素。

old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
    new[i] = v
}
fmt.Println(new...)

不能使用任何片的原因是,[]string[]interface{}之间的转换需要更改内存布局,并且转换时间为O(n)。将类型转换为interface{}需要O(1)时间。如果他们让这个for循环变得不必要,编译器仍然需要插入它。

票数 128
EN

Stack Overflow用户

发布于 2018-01-31 13:27:32

在这种情况下,类型转换是不必要的。只需将flag.Args()值传递给fmt.Println

问题:

无法将[]字符串转换为[]接口{}

我正在写一些代码,我需要它来捕获参数并通过fmt.Println传递它们(我想要它的默认行为,用空格分隔参数,并在后面加一个换行符)。

下面是代码示例:

包主导入( "fmt“”标志“) func main() { flag.Parse() fmt.Println(flag.Args()...) }

Package flag

import "flag"

func Args

func Args() []string

Args返回非标志命令行参数。

Package fmt

import "fmt"

func Println

func Println(a ...interface{}) (n int, err error)

Println对其操作数使用默认格式进行格式化,并写入标准输出。总是在操作数之间添加空格,并附加换行符。它返回写入的字节数和遇到的任何写入错误。

在这种情况下,类型转换是不必要的。只需将flag.Args()值传递给fmt.Println,它使用反射将该值解释为[]string类型。Package reflect实现了运行时反射,允许程序操作任意类型的对象。例如,

args.go

package main

import (
    "flag"
    "fmt"
)

func main() {
    flag.Parse()
    fmt.Println(flag.Args())
}

输出:

$ go build args.go
$ ./args arg0 arg1
[arg0 arg1]
$ 
票数 13
EN

Stack Overflow用户

发布于 2015-12-20 00:06:35

如果您只想打印一段字符串,则可以避免转换,并通过加入以下语句来获得完全相同的输出:

package main

import (
    "fmt"
    "flag"
    "strings"
)

func main() {
    flag.Parse()
    s := strings.Join(flag.Args(), " ")
    fmt.Println(s)
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12990338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档