gpt4 book ai didi

go - 任何惯用的生成/预处理解决方案库?

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:32 24 4
gpt4 key购买 nike

我真的很喜欢 Go 但让我对 if-err hell 以及当我在 Go 代码中与其他语言同步数据类型时感到疯狂。对于 C/C++,我可以很容易地用宏处理这些东西,而 Go 开发人员说 Go 的惯用解决方案是代码生成,但我没有找到任何开箱即用的解决方案。

所以基本上,我需要的是类似

  1. 阅读源代码,检查每种类型的用法是否列在特殊配置文件中。如果是,则将其更改为配置中的那个。
  2. 阅读源代码,检查每个函数是否在配置文件中列出。如果是,则使用模板配置中的代码片段对其进行更改,如果缺少则添加必要的导入。
  3. 可能会根据返回值添加一些多态性以防止类型转换。
  4. 也许,添加(err error) 逻辑。不确定这是个好主意。

像这样

code.go

func getConn(id platform.UUID) (res1 string, res2 platform.res) {
res1 = driver_native_res(id)
res2 = driver_native_res(id)
return
}

code-gen.go

import (
"linux"
)
func getConn(id uint64) (res1 string, res2 int32, err error) {
res1, err = linux.GetResAsString(id)
if err != nil {
return
}
res2, err = linux.GetRes(id)
if err != nil {
return
}
return
}

我知道 go AST,但用它实现这些功能似乎不是很快。我希望有一些更简单的解决方案。

最佳答案

正如您所发现的,没有宏,也不太可能有。在某些时候可能会有泛型,这可能会有所帮助。同时,有几个代码生成选项。您可以为此使用 go generate:

// add a magic comment to your go file 
// which needs some extra generated code
// this calls a tool called stringer to generate,
// but it could be yacc or some homemade tool.
//go:generate stringer -type=Pill

// call go generate to generate the methods:
go generate

https://blog.golang.org/generate

但这确实需要你像stringer一样有一个工具来生成你想要的代码。

或者您可以只使用 text/template,构建您自己的模板,然后运行一个简单的工具将值替换到该模板中(来自配置文件,或者可能是命令行上的参数)。

mytool generate -type=thing -field=type...
... mytool loads a tmplate file,
runs it through text/template and outputs it.

这非常简单,您可以使用它轻松构建自定义系统,但您可能希望生成一次,然后使用代码。以下是这种方法的一些示例:

http://clipperhouse.github.io/gen/

https://github.com/fragmenta/fragmenta

最后,您可以使用 grpc 等工具生成多种语言的结构,以简化跨语言通信,这听起来正是您正在寻找的用例:

https://grpc.io/docs/quickstart/go.html

我会先看看像 grpc 这样的东西。

关于go - 任何惯用的生成/预处理解决方案库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com