通过RPC传递不同类型的“基础”结构的惯用方法?

我正在设置一个客户端,该客户端对服务器进行RPC调用,该客户端在概念上使用a或a进行响应,但实际上只是单个基本结构类型。a 和 a 都有一个字段,但需要由客户端进行区分以进行下游处理。我想在 Go 中定义此结构的一种方式是:GetTaskMapTaskReduceTaskMapTaskReduceTaskfilename


type Task struct {

  filename string

  taskType string

}

其中要么是 或 。然后,客户端可以使用此结构类型上的一些帮助程序函数来确定它接收的类型:taskType"map""reduce"Task


func (t *Task) isMapTask() bool {

  t.taskType == "map"

}


func (t *Task) isReduceTask() bool {

  t.taskType == "reduce"

}

这将工作得相当好,并在结构类型中隐藏复杂性/实现细节。我看到的一个问题是,对于可以具有的值没有约束 - 因此客户端可以接收既不是Map也不是Reduce类型的。我担心的另一个问题是,我不确定这种结构是否存在一些我没有想到的陷阱。taskTypeTask


我的问题是,上述结构对于围棋来说是否合理和/或惯用语?


顺便说一句,我来自Ruby的OO背景,我可以想象Ruby伪代码中的以下结构:


class BaseTask


class MapTask < BaseTask


class ReduceTask < BaseTask

当然,这并不能很好地映射到Go。


慕姐8265434
浏览 78回答 1
1回答

胡说叔叔

您可以实现的两个选项是:你已经做了什么。它简单易读。如果客户端收到不受支持的类型的 taskType,它可以简单地返回错误在客户端中使用两个结构,MapTask 和 ReduceTask,可以选择使用通用基础。可以使用两个单独的连线消息,也可以使用一个消息类型包含的消息。RPC 客户端处理程序可以根据消息类型将收到的消息转换为其中一个结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go