如果我今天有 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
沒有留言:
張貼留言