2017-08-10 152 views
0

我真的很喜歡Go,但讓我爲if-err地獄而瘋狂,以及在Go代碼中使用其他語言同步數據類型時的情緒。對於C/C++,我可以輕鬆地使用宏來處理這些東西,而Go開發人員說Go的慣用解決方案是代碼生成,但是我沒有找到任何現成的解決方案。任何慣用的生成/預處理解決方案庫?

所以基本上,我需要的是像

  1. 閱讀源,每一個類型的使用檢查,如果它是在特殊的配置文件中列出。如果是,則使用config中的一個進行更改。
  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 
} 

代碼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 
} 

我知道去AST,但好像它不是很快速實現這樣的功能。我希望有一些更簡單的解決方案。

+0

[問題要求我們建議還是找一本書,工具,軟件庫,教程或其他異地資源是題外話堆棧溢出,因爲他們往往以吸引自以爲是的答案和垃圾郵件。(https://開頭計算器.COM /幫助/切合主題) – Adrian

回答

0

正如你所發現的那樣,沒有宏,也不太可能。在某些時候可能會有幫助的泛型。與此同時,代碼生成有幾個選項。您可以使用去生成此:

// 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

但它確實需要你必須生成你想要一個像桁代碼的工具。您可以使用文本/模板,構建自己的模板,然後運行一個簡單的工具,將值替換爲此模板(從配置文件或命令行中的參數)。

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先看看。

+0

[問題要求我們建議還是找一本書,工具,軟件庫,教程或其他異地資源是題外話堆棧溢出,因爲他們往往以吸引自以爲是的答案和垃圾郵件。 (https://stackoverflow.com/help/on-topic)這個問題不應該回答的,應當將其關閉。 – Adrian

+0

特別感謝GRPC,真的應該使用這樣的(但沒有谷歌AUTH)。 – Ximik

相關問題