英文:
How to make a slice to be able to convert *uint64 to *int64
问题
我是你的中文翻译助手,以下是翻译好的内容:
我是一个使用golang的初学者,我对创建子模型的切片仍然感到困惑,之后我想将索引"0"从uint64转换为int64。也许我在转换字段的方式上有误,但我认为在转换之前需要将子模型转换为切片。以下是代码:
params := category.PostAPICategoryParams{
Data: category.PostAPICategoryBody{
CategoryData: categoryTestData.CategoryData,
Childs: categoryTestData.Childs,
},
}
result, _ := mainSuite.h.CreateCategory(mainSuite.rt, ¶ms.Data.CategoryData, params.Data.Childs)
categoriesParamsTest := &category.GetAPICategoryParams{
ParentID: // 这里是我需要编写的代码,
}
在创建切片之前尝试编写代码时出现了错误。
英文:
I'm a beginner in using golang, I'm still confused about creating a slice for the child model, after that I want to take index "0" and convert it from *uint64 to *int64. Maybe i'm wrong way to convert the field, but i think i need to make the child model into a slice first before converting it. Here is the code :
params := category.PostAPICategoryParams{
Data: category.PostAPICategoryBody{
CategoryData: categoryTestData.CategoryData,
Childs: categoryTestData.Childs,
},
}
result, _ := mainSuite.h.CreateCategory(mainSuite.rt, &params.Data.CategoryData, params.Data.Childs)
categoriesParamsTest := &category.GetAPICategoryParams{
ParentID: // here is the code I need to write,
}
Here is the error when I try to write the code before creating the slice :
答案1
得分: 1
你有一个指向 uint64
的指针,想要一个指向 int64
的指针。没有直接(安全)的方法可以做到这一点,因为指向无符号整数的指针与指向有符号整数的指针不兼容,但是你可以将指针指向的值转换为正确的类型(假设指针不为nil)。
例如:
func convertUnsignedToSignedPointer64(p *uint64) *int64 {
if p == nil { return nil }
x := int64(*p)
return &x
}
你也可以通过 unsafe
包来实现,尽管我在编写代码时尽量避免使用 unsafe
包:
func convertUnsignedToSignedPointer64(p *uint64) *int64 {
return (*int64)(unsafe.Pointer(p))
}
根据 unsafe.Pointer
中的规则,这是可以的:
(1) 将 *T1 转换为指向 *T2 的指针。
假设 T2 不比 T1 大,并且两者具有等效的内存布局,这种转换允许将一种类型的数据重新解释为另一种类型的数据。
英文:
You have a pointer to a uint64
, and want a pointer to a int64
. There's no direct (safe) way to do this -- pointers to unsigned ints aren't compatible with pointers to signed ints -- but you can convert the pointed-at value to the right type (assuming the pointer isn't nil).
For example:
func convertUnsignedToSignedPointer64(p *uint64) *int64 {
if p == nil { return nil }
x := int64(*p)
return &x
}
You can also do it via the unsafe
package, although I prefer avoiding the unsafe
package in code I write when possible:
func convertUnsignedToSignedPointer64(p *uint64) *int64 {
return (*int64)(unsafe.Pointer(p))
}
This is ok via the rules given in unsafe.Pointer
:
> (1) Conversion of a *T1 to Pointer to *T2.
>
> Provided that T2 is no larger than T1 and that the two share an
> equivalent memory layout, this conversion allows reinterpreting data
> of one type as data of another type.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论