Go 有哪些奇技淫巧

2023-03-21 12:33:44 +08:00
 LeegoYih

比如[]T[]any,只能通过遍历显式类型转换吗?有没有其他方法。

func toAnyArray[T any](s []T) []any {
    t := make([]any, len(s))
    for i, v := range s {
        t[i] = v
    }
    return t
}
2871 次点击
所在节点    Go 编程语言
6 条回复
caotian
2023-03-21 13:12:02 +08:00
试试 lo 库
0o0O0o0O0o
2023-03-21 13:25:26 +08:00
qieqie
2023-03-21 14:14:42 +08:00
转[]any/ {}interface 比较特殊,其它类型可以用 reflect.SliceHeader 之类的奇技淫巧
https://github.com/golang/go/wiki/InterfaceSlice
keakon
2023-03-21 15:31:02 +08:00
如果类型兼容,用 unsafe.Pointer 转,但是 []any 不行

a := []int{1, 2, 3}
b := *(*[]uint)(unsafe.Pointer(&a))
fmt.Println(b)
c := *(*[]float32)(unsafe.Pointer(&a))
fmt.Println(c)
d := *(*[]float64)(unsafe.Pointer(&a))
fmt.Println(d)
e := *(*[]any)(unsafe.Pointer(&a))
fmt.Println(e)

如果是做接口的话,不建议用 []any ,直接用 any ,然后做类型检查,文档中注明比较好。
LeegoYih
2023-03-21 19:24:55 +08:00
@keakon 谢谢,是调用方,实际场景是调用 sql.Stmt 的 Query 方法`func (s *Stmt) Query(args ...any) (*Rows, error)`
暂时先不用泛型了吧🤣
guonaihong
2023-03-30 20:37:21 +08:00
Copilot, 回车工程师的诞生。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925805

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX