【问题标题】:Invalid Receiver Type - Possible to use with a struct of myType?接收器类型无效 - 可以与 myType 结构一起使用吗?
【发布时间】: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 才能调用该方法。
  • 非常感谢您的回答我现在已经解决了感谢您的帮助。

标签: go slice


【解决方案1】:

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

type TypeSlice []Type

然后在上面定义方法。

the spec section on types 对此进行了介绍。

【讨论】:

  • 公平,指针的处理方式与任何其他可能会绊倒一些用户的复合类型不同。更新了答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多