2024年1月9日 星期二

Golang 需要不同 Go 版本有不同處理

如果我今天有 go code 需要不同版本有不同處理,要如何寫?

例如說, go 1.18 支援泛型了,但我的 code 要舊版,例如 1.17,也能執行。要如何處理

經過查詢,這可以靠 //go:build 註解處理。

舉例來說,我有以下兩個檔案

// main-old.go
package main

import "fmt"

func main(){
	fmt.Println("You use old go version")
}
// main-new.go
package main

import "fmt"

func main(){
	fmt.Println("You use new version")
}

我希望使用 1.20 以上(含)版本時,使用 main-new.go;舊版本使用 main-old.go 。

將 main-old.go 改成 (追加最上面兩行):

//go:build !go1.20 
// +build !go1.20 

package main

import "fmt"

func main(){
	fmt.Println("You use old go version")
}

main-new.go 改成 (一樣追加最上面兩行):

//go:build go1.20 
// +build go1.20 

package main

import "fmt"

func main(){
	fmt.Println("You use new version")
}

改完後,使用 go1.20、1.21、1.22……甚至更高的版本,都會輸出 You use new version; go1.19(含)以下則是 You use old go version

移除 +build

如果使用的版本是 go1.17 以上,其實上面的內容可以移除掉 // +build 那一行,即改成:

//go:build !go1.20 

package main

import "fmt"

func main(){
	fmt.Println("You use old go version")
}

因為 go 1.17 將 // +build 剔除,以 //go:build 取代之(Go 1.17 Release Notes: //go:build lines

例外狀況

牽扯到 go1.16(含)以下的版本,會跳出以下錯誤:

./main-old.go: main redeclared in this block
        previous declaration at ./main-new.go

由於我使用的是 go 1.20 了,所以沒特別去研究為什麼。

參考資料

Tim , H. (2017, August 28). Version Constraints and Go. Medium. https://medium.com/@theckman/version-constraints-and-go-c9309be15773

沒有留言:

張貼留言