【发布时间】:2018-10-03 01:31:13
【问题描述】:
尝试在 Go 中创建微服务,我有一个包网络来处理获取字节并转换为特定请求:
package network
type Request interface {
}
type RequestA struct {
a int
}
type RequestB struct {
b string
}
func GetRequestFromBytes(conn net.Conn) Request {
buf := make([]byte, 100)
_, _ := conn.Read(buf)
switch buf[0] {
case 0:
// convert bytes into RequestA
requestA = RequestAFromBytes(buf[1:])
return requestA
case 1:
requestB = RequestBFromBytes(buf[1:])
return requestB
}}
现在主要是我要处理请求。
package main
import (
"network"
)
(ra *RequestA) Handle() {
// handle here
}
(rb *RequestB) Handle() {
// handle
}
func main() {
// get conn here
req = GetRequestFromBytes(conn)
req.Handle()
}
但是,Golang 不允许在主包中扩展 RequestA/RequestB 类。我在网上找到的两个解决方案是类型别名/嵌入,但看起来我们都必须通过在运行时查找请求的特定类型来处理。这需要在网络包和主包中都使用 switch/if 语句,这会重复两者中的代码。
最简单的解决方案是将 switch 语句移到 package main 中,我们在其中确定请求的类型然后处理它,但是 package main 必须处理原始字节,我想避免这种情况。查找请求类型并将其“向上”发送的责任应由网络包负责。
有没有一种简单的惯用 Go 方法来解决这个问题?
【问题讨论】:
标签: go interface network-programming microservices