我只是尝试不同的事情来学习 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
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试重写 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
}
Run Code Online (Sandbox Code Playgroud)
看这个答案:函数声明语法:函数名之前括号中的内容
看起来应该是可能的 - 然而这个答案似乎说这是不可能的:Golang Monkey patching。
是否可以重写这个,这样我就可以做到
lbl := &[]imageData{}
lbl.InitImageNew(4)
Run Code Online (Sandbox Code Playgroud)
您只能在命名类型(或指向命名类型的指针)上定义方法。[]Type是复合型。您可以通过定义它来使其成为命名类型:
type TypeSlice []Type
Run Code Online (Sandbox Code Playgroud)
然后在其上定义方法。
这在关于 types 的规范部分中有介绍。