Golang SQL问题:参数$1类型转换失败,不支持[3]int64数组类型
Golang SQL问题:参数$1类型转换失败,不支持[3]int64数组类型 我的函数定义是
func (s *Stmt) CheckNamedValue(nv *driver.NamedValue) (err error) {
switch d := nv.Value.(type) {
case []int64:
err = nil
default:
nv.Value, err = driver.DefaultParameterConverter.ConvertValue(nv.Value)
}
return err
}
这个函数在我传递 []int64 时工作正常,但传递 [size]int64 时不行。我正在检查类型,但为什么上述两种类型是不同的?
更多关于Golang SQL问题:参数$1类型转换失败,不支持[3]int64数组类型的实战教程也可以访问 https://www.itying.com/category-94-b0.html
一切顺利吗?
更多关于Golang SQL问题:参数$1类型转换失败,不支持[3]int64数组类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢……这个方法有效,抱歉这么晚才回复。
有人能帮我解决这个问题吗?😞😫
引用 akhilravuri 的话:
如果我传递
[]int64这个函数可以正常工作,但传递[size]int64就不行。 我正在检查类型,但为什么这两者会不同呢?
Go 是静态类型语言,因此对数据类型本身要求非常严格。[]int64 是一个切片(简单来说:“可以把它想象成一个装满数组的篮子,形成’动态数组’”),而 [size]int64 是一个数组。由于它们是两种不同的数据类型,Go 会抛出错误。
要解决这个问题,你可以使用切片边界 [:] 轻松地将任何现有数组转换为切片。
a := [size]int64{ ... }
x := a[:] // x 现在是 []int64 类型
在Go语言中,[]int64 和 [size]int64 是两种完全不同的类型,这解释了为什么你的类型检查无法匹配数组类型。
类型差异说明:
[]int64是切片类型(slice)[size]int64是数组类型(array),其中size是具体的整数值
在Go的类型系统中,切片和数组是不同的类型,即使它们包含相同的基础元素类型。数组的长度是其类型的一部分,所以 [3]int64 和 [5]int64 也是不同的类型。
解决方案:
你需要为数组类型添加单独的类型检查分支:
func (s *Stmt) CheckNamedValue(nv *driver.NamedValue) (err error) {
switch d := nv.Value.(type) {
case []int64:
// 处理切片类型
err = nil
case [3]int64:
// 处理长度为3的int64数组
err = nil
case [5]int64:
// 处理长度为5的int64数组
err = nil
default:
nv.Value, err = driver.DefaultParameterConverter.ConvertValue(nv.Value)
}
return err
}
如果你需要处理任意长度的int64数组,可以使用反射:
import "reflect"
func (s *Stmt) CheckNamedValue(nv *driver.NamedValue) (err error) {
switch d := nv.Value.(type) {
case []int64:
err = nil
default:
// 检查是否为任意长度的int64数组
rv := reflect.ValueOf(nv.Value)
if rv.Kind() == reflect.Array && rv.Type().Elem().Kind() == reflect.Int64 {
err = nil
} else {
nv.Value, err = driver.DefaultParameterConverter.ConvertValue(nv.Value)
}
}
return err
}
或者将数组转换为切片来处理:
func (s *Stmt) CheckNamedValue(nv *driver.NamedValue) (err error) {
switch d := nv.Value.(type) {
case []int64:
err = nil
case [3]int64:
// 将数组转换为切片
slice := d[:]
nv.Value = slice
err = nil
default:
nv.Value, err = driver.DefaultParameterConverter.ConvertValue(nv.Value)
}
return err
}
这样就能正确处理数组类型了。

