如何将已知类型转换为指向开关中类型参数的指针?
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
。
以上就是如何将已知类型转换为指向开关中类型参数的指针?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341