接收器类型无效 - 可以与 myType 结构一起使用吗?

Blu*_*ris 3 go slice

我只是尝试不同的事情来学习 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)

Adr*_*ian 7

您只能在命名类型(或指向命名类型的指针)上定义方法。[]Type复合型。您可以通过定义它来使其成为命名类型:

type TypeSlice []Type
Run Code Online (Sandbox Code Playgroud)

然后在其上定义方法。

这在关于 types 的规范部分中有介绍。