回答

收藏

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

本版积分规则