簡體   English   中英

如何在 Go 中實現宏?

[英]how to implement macros in Go?

我在 C++ 中完成了項目,我使用#define宏給項目命名,我在幾個地方使用過,我不經常更改此名稱,但有時我可能需要更改此名稱,然后我更改此宏並重建我的代碼。 現在我正在將此代碼轉換為 Go。 有人可以建議我如何在 Go 中實現它嗎? 我對為此目的使用全局變量不感興趣,因為我有很多這樣的宏,我懷疑這會導致我的項目占用更多 cpu 並影響性能。

幸運的是,Go 不支持宏。

Go 中有兩個地方可以實現使用其他編程語言中的宏所做的事情:

  • “元編程”是使用代碼生成完成的。
  • “魔術變量/常量”在鏈接時使用“符號替換”實現。

看來,后者才是你所追求的。

不幸的是,此功能的幫助本身幾乎無法發現,但它在輸出中進行了解釋

$ go tool link -help

從中引用相關位:

-X definition

添加表單importpath.name=value字符串值definition

所以你像這樣滾動:

  1. 在任何方便的包中,您可以定義一個字符串常量,您希望在構建時更改其值。

    假設您在包foo定義了常量Bar

  2. 您可以在編譯時為鏈接階段的go buildgo install調用傳遞一個特殊標志:

     $ go install -ldflags='-X foo.Bar="my super cool string"'

結果,生成的二進制文件將在其“只讀數據”段中將常量foo.Bar設置為值“我的超酷字符串”,該值將被程序代碼使用。

另請參閱有關-ldflags選項的go help build輸出。

Go 不支持Macros
但是您可以在包中使用常量並在需要時引用它。

package constant
// constants.go file

const (
    ProjectName = "My Project"
    Title       = "Awesome Title"
)

在你的程序中

package main
import "<path to project>/constant" // replace the path to project with your path from GOPATH

func main() {
     fmt.Println(constant.ProjectName)
}

項目結構將是

project
   |- constant
   |      |- constants.go
   |-main.go

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM