无法将 []string 转换为 []interface {}
技术问答
246 人阅读
|
0 人回复
|
2023-09-12
|
我正在编写一些代码,我需要它来捕获参数并传递它们fmt.Println
+ g* H) o) Y' P(我希望它的默认行为由空间分隔,然后与换行符编写参数)。但它需要[]interface {}但flag.Args()返回一个[]string.
' D& _4 N% Y# N4 f% J这是代码示例:
* T/ }0 u# i/ Y. B" tpackage mainimport "fmt" "flag")func main() flag.Parse() fmt.Println(flag.Args()...)}* n, q1 |' b; i0 L( q: a4 }
这将回到以下错误:
) _! W' h' _' b- X Q/ u: ]./example.go:10: cannot use args (type []string) as type []interface {} in function argument! D {) Z r" [& M) d1 u& i6 L
这是个错误吗?不应该吗?fmt.Println采取任何顺便说一句,我也试过这样做:7 w6 d: r/ s2 o% ~3 P( x
var args = []interface{}(flag.Args())
3 B( X( r2 ?5 H, F! N% ]1 O 但是收到了以下错误:, [' t% `. E* `* \% }
cannot convert flag.Args() (type []string) to type []interface {}8 _. n) v8 ]- \2 Y
有没有“Go解决这个问题的方法?7 z! {& F2 T$ k
2 ?* o+ z! v2 k* `
解决方案:
+ c0 l( D; y# W/ U: v' h 这不是错的。fmt.Println()需要一个[]interface{}类型。这意味着它必须是一个interface{}切片值,而不是任何切片。您需要循环并复制每个元素来转换切片。
) |: ? E2 K: ]. b) Dold := flag.Args()new := make([]interface{},len(old))for i,v := range old new = v}fmt.Println(new...)) a' U4 j8 Y1 ]; K: `: [
你不能使用任何切片的原因是 a[]string和 a转换[]interface{}在 O(n) 发生在时间内。将类型转换为类型。interface{}需要 O(1) 时间。如果他们不需要这个 for 循环,编译器仍然需要插入。 |
|
|
|
|
|