我正在编写一些代码,我需要它来捕获参数并传递它们fmt.Println
(我希望它的默认行为,写入由空格分隔的参数,然后是换行符).但它需要[]interface {}但flag.Args()返回一个[]string.
这是代码示例:
package main
import (
"fmt"
"flag"
)
func main() {
flag.Parse()
fmt.Println(flag.Args()...)
}
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误:
./example.go:10: cannot use args (type []string) as type []interface {} in function argument
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?不应该fmt.Println采取任何阵列?顺便说一句,我也试过这样做:
var args = []interface{}(flag.Args())
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
cannot convert flag.Args() (type []string) to type []interface {}
Run Code Online (Sandbox Code Playgroud)
是否有"Go"方式解决此问题?
我发现它很奇怪,为什么[]字符串无法转换为[] interface {}?
我认为这应该是可能的,因为:
但在下面的示例中,它将是编译错误
func f(args ...interface{}){
}
s := []string{"ssd", "rtt"}
f(s...)
Run Code Online (Sandbox Code Playgroud)
为什么语言无法自动完成转换?
type MyObject string
var objects []MyObject
Run Code Online (Sandbox Code Playgroud)
我想对这些对象进行排序.标准库有sort.Strings,但需要一个实例[]string而不是[]MyObject.
我目前的解决方案是实现sort.Interface(如下所示)并使用sort.Sort,但我想摆脱那个样板代码.有更好的方法吗?
type MyObjects []MyObject
func (objs MyObjects) Len() int {
return len(objs)
}
func (objs MyObjects) Less(i, j int) bool {
return strings.Compare(string(objs[i]), string(objs[j])) < 0
}
func (objs MyObjects) Swap(i, j int) {
o := objs[i]
objs[i] = objs[j]
objs[j] = o
}
Run Code Online (Sandbox Code Playgroud)