Golang Go语言中有哪些奇技淫巧
比如[]T
转[]any
,只能通过遍历显式类型转换吗?有没有其他方法。
func toAnyArray[T any](s []T) []any {
t := make([]any, len(s))
for i, v := range s {
t[i] = v
}
return t
}
Golang Go语言中有哪些奇技淫巧
转[]any/ {}interface 比较特殊,其它类型可以用 reflect.SliceHeader 之类的奇技淫巧
https://github.com/golang/go/wiki/InterfaceSlice
如果类型兼容,用 unsafe.Pointer 转,但是 []any 不行
a := []int{1, 2, 3}
b := ([]uint)(unsafe.Pointer(&a))
fmt.Println(b)
c := ([]float32)(unsafe.Pointer(&a))
fmt.Println©
d := ([]float64)(unsafe.Pointer(&a))
fmt.Println(d)
e := ([]any)(unsafe.Pointer(&a))
fmt.Println(e)
如果是做接口的话,不建议用 []any ,直接用 any ,然后做类型检查,文档中注明比较好。
谢谢,是调用方,实际场景是调用 sql.Stmt 的 Query 方法func (s *Stmt) Query(args ...any) (*Rows, error)
暂时先不用泛型了吧🤣
Copilot, 回车工程师的诞生。
在Golang(Go语言)中,存在一些有趣的特性和技巧,这些常常被开发者们戏称为“奇技淫巧”。以下是一些值得注意的Golang奇技淫巧:
- 特殊注释:如
//go:noinline
,用于阻止编译器对内联函数的优化,以避免因函数体复制过多导致的性能问题。类似的还有//go:nosplit
,用于跳过栈溢出检测以提高性能,但需注意可能导致的栈溢出风险。 - 逃逸分析:Go语言中的逃逸分析是编译器在编译期判断变量是否逃逸到堆上的过程。通过显式地告诉编译器某个变量不会逃逸,可以使用
//go:noescape
注释(虽然这不是官方文档直接支持的,但类似思想存在),从而优化内存分配和垃圾回收。 - linkname指令:使用
//go:linkname
可以将某个函数或变量的名称与另一个(通常是底层的或不同包的)函数或变量关联起来,实现底层访问或优化。但需注意,这可能会破坏类型系统和包模块化,因此应谨慎使用。 - 内建函数与底层操作:Go语言的运行时和内建包提供了许多底层操作,如原子操作、内存对齐等,通过合理使用这些功能,可以实现高效的并发编程和内存管理。
需要注意的是,虽然这些奇技淫巧在某些场景下非常有用,但它们也可能带来额外的复杂性和风险。因此,在使用时应权衡利弊,确保代码的可读性和可维护性。