【发布时间】:2020-05-22 16:33:12
【问题描述】:
我只是在尝试不同的东西来学习 Go 并了解其工作原理。目前正在玩切片和自定义类型。
我有以下代码可以正常工作并且符合预期。
package imgslice
import (
"fmt"
"image"
)
type imageData struct {
position int // Image Number
image *image.RGBA // Image Store
height int // Height In Pixels
width int // Width In Pixels
}
func init() {
fmt.Println("Starting")
lbl := &[]imageData{}
println(lbl)
InitImage(lbl, 3)
fmt.Printf("%#v\n", lbl)
}
// Initalise the imageData arrray
func InitImage(l *[]imageData, images int) {
var i int
var newRecord imageData
for i = 0; i < images; i++ {
newRecord = imageData{position: i}
*l = append(*l, newRecord)
}
return
}
我正在尝试重新编写 InitImage 函数以作为一种方法工作(我认为这是正确的术语)。但我得到了错误:
无效的接收器类型 *[]imageData([]imageData 不是定义的类型)
(编辑:func (l *[]imageData) InitImageNew(images int) { 行有错误)
我想这样做的唯一原因是 a) 学习看看是否可以做到 b) 从风格上讲,我认为我更喜欢将切片作为额外参数。
func (l *[]imageData) InitImageNew(images int) {
var i int
var newRecord imageData
for i = 0; i < images; i++ {
newRecord = imageData{position: i}
*l = append(*l, newRecord)
}
return
}
看这个答案:Function declaration syntax: things in parenthesis before function name
这似乎应该是可能的 - 但是这个答案似乎说这是不可能的:Golang monkey patching。
是否可以重写这个,所以我可以这样做
lbl := &[]imageData{}
lbl.InitImageNew(4)
【问题讨论】:
-
接收器必须是已定义的类型。
[]Type不是已定义的类型。您可以定义它:type ArrImageData []imageData并使用*ArrImageData作为接收者。但是你必须将 []imageData 转换为 ArrImageData 才能调用该方法。 -
非常感谢您的回答我现在已经解决了感谢您的帮助。