无法将 []string 转换为 []interface {}
技术问答
290 人阅读
|
0 人回复
|
2023-09-12
|
我正在编写一些代码,我需要它来捕获参数并传递它们fmt.Println
* a! V# K3 r0 l(我希望它的默认行为由空间分隔,然后与换行符编写参数)。但它需要[]interface {}但flag.Args()返回一个[]string.
7 a/ p" m- [! i3 |$ k4 \这是代码示例:
; \& r6 U1 z: C' C( I) Qpackage mainimport "fmt" "flag")func main() flag.Parse() fmt.Println(flag.Args()...)}
6 [1 r9 Z1 i) Y) z9 Z 这将回到以下错误:' H- a9 x' }& f/ L
./example.go:10: cannot use args (type []string) as type []interface {} in function argument0 q. J$ Z/ G7 T E6 |2 W
这是个错误吗?不应该吗?fmt.Println采取任何顺便说一句,我也试过这样做:8 \& }& F ]6 c! m2 \
var args = []interface{}(flag.Args())
7 |: w7 b1 x& G& s 但是收到了以下错误:9 ^3 h" Y% `+ S
cannot convert flag.Args() (type []string) to type []interface {}8 V$ _( h% b& `, h, S6 g
有没有“Go解决这个问题的方法? X% \$ v* E9 x
" G5 E) |. ~$ f 解决方案:
* D+ w) |+ ^# @ 这不是错的。fmt.Println()需要一个[]interface{}类型。这意味着它必须是一个interface{}切片值,而不是任何切片。您需要循环并复制每个元素来转换切片。
! O* D+ @# B- P4 S# f: k& gold := flag.Args()new := make([]interface{},len(old))for i,v := range old new = v}fmt.Println(new...)
; E4 |2 }0 I! c" S; ^ 你不能使用任何切片的原因是 a[]string和 a转换[]interface{}在 O(n) 发生在时间内。将类型转换为类型。interface{}需要 O(1) 时间。如果他们不需要这个 for 循环,编译器仍然需要插入。 |
|
|
|
|
|