首页 >后端开发 >Golang >如何将已知类型转换为指向开关中类型参数的指针?

如何将已知类型转换为指向开关中类型参数的指针?

王林
王林转载
2024-02-09 11:30:181038浏览

如何将已知类型转换为指向开关中类型参数的指针?

php小编香蕉将为大家介绍如何将已知类型转换为指向开关中类型参数的指针。在编程中,有时我们需要将一个已知类型的变量转换为指针,以便在程序中更灵活地操作。这种转换可以通过使用“&”运算符来实现。将变量名前加上“&”运算符,即可将其转换为指向该变量的指针。这样,我们就可以在程序中使用指针来操作变量,而不仅仅是对其进行赋值或读取操作。接下来,我们将详细介绍如何进行这种类型转换,并提供示例代码帮助大家更好地理解。

问题内容

我正在尝试编写一个函数,根据返回值的类型参数,将 json 字符串的字节数组转换为另一个字节数组,规则如下:

  • map[string]interface{}:转换为map[string]interface{}
  • []byte:不转换,按原样返回
  • struct:转换为struct

我的代码如下:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) { // https://appliedgo.com/blog/a-tip-and-a-trick-when-working-with-generics
    case *[]byte:
        result = &t(jsonbytearray)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}

此代码在将 jsonbytearray 的类型转换为 t 时出现类型错误,如下所示:

cannot convert jsonByteArray (variable of type []byte) to type T

如何将这个[]byte类型变量的指针赋给泛型类型返回值?

解决方法

由于t受到any的约束,所以不能直接转换。您必须断言 &jsonbytearray 实际上与该开关情况下的 *t 类型相同:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) {
    case *[]byte:
        result = any(&jsonbytearray).(*t)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}

这使得编译错误消失,但这并不是特别好的设计。如果您需要将 json.unmarshal 专门用于一种类型 (*[]byte),您最好更改调用站点而不是使用通用函数。

我假设您的目标是允许调用者按原样获取字节切片,而不是解组。然后在调用站点,您可以将该函数调用为

data := GetJsonData[[]byte](jsonByteArray)

这意味着此时您已经知道 jsonbytearray 是一个字节切片。

那么,就没有理由调用该函数了。您可以简单地获取参数的地址: data := &jsonbytearray ,并在其他地方使用 json.unmarshal

以上是如何将已知类型转换为指向开关中类型参数的指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除