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

5 回复

一切顺利吗?

更多关于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
}

这样就能正确处理数组类型了。

回到顶部