Go语言 无效的接收器类型-是否可以与myType的结构一起使用?

nfzehxib  于 2023-03-06  发布在  Go
关注(0)|答案(2)|浏览(128)

我只是在尝试不同的东西来学习和理解它是如何工作的结构。目前正在玩切片和自定义类型。
我有下面的代码,工作正常,如预期.

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不是已定义的类型)
(edit:错误位于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)
piztneat

piztneat1#

您只能在 named types(或指向命名类型的指针)上定义方法。[]Typecompound type。您可以通过以下方式将其定义为命名类型:

type TypeSlice []Type

然后在其上定义方法。
这在类型的规范部分中有介绍。

j9per5c4

j9per5c42#

这个问题是我搜索的第一个问题,所以我会添加我的问题是什么:我有type MyType = struct {(带等号)作为根本原因。删除等号有帮助。

相关问题