我正在编写一些代码,我需要它来捕获参数并通过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“的方法来解决这个问题?
发布于 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循环变得不必要,编译器仍然需要插入它。
发布于 2018-01-31 13:27:32
在这种情况下,类型转换是不必要的。只需将flag.Args()
值传递给fmt.Println
。
问题:
无法将[]字符串转换为[]接口{}
我正在写一些代码,我需要它来捕获参数并通过fmt.Println传递它们(我想要它的默认行为,用空格分隔参数,并在后面加一个换行符)。
下面是代码示例:
包主导入( "fmt“”标志“) func main() { flag.Parse() fmt.Println(flag.Args()...) }
import "flag"
func Args() []string
Args
返回非标志命令行参数。
import "fmt"
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]
$
发布于 2015-12-20 00:06:35
如果您只想打印一段字符串,则可以避免转换,并通过加入以下语句来获得完全相同的输出:
package main
import (
"fmt"
"flag"
"strings"
)
func main() {
flag.Parse()
s := strings.Join(flag.Args(), " ")
fmt.Println(s)
}
https://stackoverflow.com/questions/12990338
复制相似问题