回答

收藏

无法将 []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) Q
    package 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& g
    old := 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 循环,编译器仍然需要插入。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则