登录
首页 >  Golang >  Go问答

将字节序列优雅地转换为不同的数据类型

来源:stackoverflow

时间:2024-02-23 19:00:28 285浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《将字节序列优雅地转换为不同的数据类型》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

var response Response
switch wrapper.Domain {
case "":
    response = new(TypeA)
case "TypeB":
    response = new(TypeB)
case "TypeC":
    response = new(TypeC)
case "TypeD":
    response = new(TypeD)
}
_ = decoder.Decode(response)

如代码片段所示,我从wrapperdomain字段中获得了足够的信息来确定响应的类型,并且对于每种类型,执行以下操作:

  1. 使用 new 创建该类型的新实例
  2. 使用解码器将字节切片解码为步骤 1 中创建的实例 我想知道是否有一种方法可以使第一步更加通用并摆脱 switch 语句。

解决方案


关于您的代码的一些信息

根据评论中的讨论,我想分享一些经验。

我认为您的解决方案没有什么不好的地方,但是几乎没有什么可以改进它的选项,这取决于您想要做什么。

您的代码看起来像经典的 factory。 factory 是一种模式,它根据一些输入参数创建单个系列的对象。

在 golang 中,这通常以更简单的方式用作 factory 方法 ,有时称为 factory 函数

示例:

type vehicle interface {};
type car struct {}

func newcar() vehicle {
   return &car{}
}

但是您可以轻松扩展它来执行像您一样的操作:

package main

import (
    "fmt"
    "strings"
)

type vehicle interface {}
type car struct {}
type bike struct {}
type motorbike struct {}

// newdrivinglicensecar returns a car for a user, to perform 
// the driving license exam.
func newdrivinglicensecar(drivinglicense string) (vehicle, error) {
    switch strings.tolower(drivinglicense) {
    case "car":
        return &car{}, nil
    case "motorbike":
        return &motorbike{}, nil
    case "bike":
        return &bike{}, nil
    default:
        return nil, fmt.errorf("sorry, we are not allowed to make exam for your type of car: \"%s\"", drivinglicense)
    }
}

func main() {
    fmt.println(newdrivinglicensecar("car"))
    fmt.println(newdrivinglicensecar("tank"))
}

以上代码产生输出:

&{} 
 Sorry, We are not allowed to make exam for your type of car: "Tank"

因此,您可能可以通过以下方式改进代码:

  • 关闭为单个函数,该函数接受 string 并生成 response 对象
  • 添加一些验证和错误处理
  • 给它一些合理的名称。

与factory相关的模式很少,可以替代这个模式:

  • 责任链
  • 调度员
  • 访客
  • 依赖注入

反思?

@icza 也有关于 reflection 的评论。我同意他的观点,这是常用的,而且我们无法避免代码中的反射,因为有时事情就是如此动态。

但在您的情况下,这是一个糟糕的解决方案,因为:

  • 你失去了编译时类型检查
  • 添加新类型时必须修改代码,那么为什么不在这个工厂函数中添加新行呢?
  • 您会使代码变慢(请参阅参考资料),这会导致性能损失 50%-100%。
  • 你让你的代码变得如此难以阅读和复杂
  • 您必须添加更多的错误处理来覆盖反射引起的重大错误。

当然,您可以添加大量测试来覆盖大量场景。您可以在代码中支持 typeatypebtypec,并且可以通过测试覆盖它,但在生产代码中有时您可以传递 typexyz,如果没有捕获它,您将收到运行时错误。

结论

您的 switch/case 场景没有什么不好,可能这是做您想做的事情的最具可读性和最简单的方法。

参考

以上就是《将字节序列优雅地转换为不同的数据类型》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>