dt2015 2019-04-10 02:20
浏览 46
已采纳

在闭包上使用方法更好吗?

I have a simple type of data that only consists of an uint32, but many operations can be performed on this data. All files that use this data reside in the same package and therefore can access the unexported uint32 inside the struct which is not preferable. I recently learned about the power of closures and was wondering if it is better to use a struct that contains functions that perform the tasks or to have the uint32 stored in the struct and then just use methods with a receiver of the struct.

This is a basic representation of an OpenGL shader. Both the method and closure options, look the same to the caller but perform differently under the hood.

Closure:

type Shader struct {
    getID  func() uint32
    delete func()
}

func CreateShader(shader string) Shader {
    var id uint32
    //Do work...
    return Shader{
        getID: func() uint32 {
            return id
        },
        delete: func() {
            gl.DeleteShader(id)
        },
    }
}

Methods:

type Shader struct {
    id uint32
}

func CreateShader(shader string) Shader{
    var id uint32
    //Do work...
    return Shader{id: id}
}

func (s Shader) getID() uint32 {
    return s.id
}

func (s Shader) delete() {
    gl.DeleteShader(s.id)
}

Both options appear like this in use:

func main() {
    shader := CreateShader("shader.code")
    id := shader.getID()
    fmt.Println(id)
    shader.delete()
}

The miss use I thought to avoid was that the caller could affect the id type without Shader knowing. Something similar to:

shader.id = 4102 // or some other change

With the use of closures this behavior is impossible and requires the caller to go use the proper calls.

As mentioned in the comments, it is possible to use a shader package and unexport the shader type. I didn't use this because I thought it was improper to make an entire package just to hold one file. But perhaps it is proper if it solidifies correct use of the type.

Is there any reason that the closure version is "wrong" compared to the methods? Are there any golang standards that would classify either choice better suited for my use case? I expect the caller to not touch the id of the shader and think that the use of closures makes it clearer the proper use of the shader type.

  • 写回答

1条回答 默认 最新

  • dongyao8698 2019-04-10 06:19
    关注

    Closures and methods solve entirely different problems, so it's rare that you should ever ask which one to use in a particular situation.

    Having said that, closures can be a way to provide data protection, and are often (ab)used for this in languages which don't otherwise offer private variables (i.e. JavaScript).

    There's no reason to ever use them for this purpose in Go.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿