成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 為什么不支持從 main 包中導入函數?

開發 前端
在本次對 Go 工具限制從 main 包中導入相關函數的緣由,我們做了詳盡的了解和分析。雖然 Go 官方這樣的方式可以一刀切的解決復雜度和安全性的問題。

大家好,我是煎魚。

作為一個維護過許多有一定歷史沉淀的 Go 項目的人,在歷史債務下和奇葩需求下,會遇到一些迫于業務需求的技術訴求。

訴求上是希望引用多項目,會出現從 main 包(package)中導入相關函數的這種使用訴求。為了將多 Go 工程合并到一個大單體中使用。

問題案例

具體的使用案例如下。

我們有一個 Go 應用,目錄結構如下:

demo1
├── go.mod
├── main.go
└── x
    └── main.go

demo1/x/main.go 文件內代碼如下:

package main

import (
 "fmt"
)

func main() {
 Main()
}

func Main() {
 fmt.Println("煎魚進水了?")
}

demo1/main.go 文件內代碼如下:

package main

import (
 "fmt"

 xmain "example.com/greet/x"  // 也就是本應用,上面的 x
)

func main() {
 fmt.Println("腦子進煎魚了!")
 xmain.Main()
}

簡單來講,就是 demo1 這個 Go 項目,擁有兩個 main 包。根目錄下的 main.go 文件內引用了 x/main.go 內的 Main 方法。

運行該程序,看看運行結果:

$ go run main.go
main.go:6:2: import "example.com/greet/x" is a program, not an importable package

會直接報錯,提示 x 包下是一個程序,而不是一個可導入的包。

為什么不支持導入 main 包

這個問題稍微可以收斂一下,關鍵內容是:為什么不支持導入 main 包內的函數?明明 main 包也是一個 package,其個別函數也是大寫開頭,是允許對外導出的。

我首先翻閱了一下 Go 語言規范(spec),確實沒有非常明確禁止該項行為。但又確實在我們日常使用和編譯運行時,會被拒絕運行。提示前面的錯誤。

隨后又查看了具體的代碼提交和 CL,實際上在 13 年前。現任 Go 核心團度負責人 @rsc 是提交過相應 main 包支持的。

如下 CL 所示:

圖片圖片

2011 年(13 年前)的 CL 移除了原本語言規范中定義的 “程序中的其他包都不能命名為 main” 的要求,也就是可以滿足前文問題和背景中提到的使用訴求。

看到這里有的同學就疑惑了。怎么 13 年后的現在,2024 年。又不行了呢?而且感覺是不行好久了。

因為在 2015 年時,現任 Go 核心團隊成員 @ianlancetaylor,又又又改了,增加了非常明確的判斷,直接限制了。

如下代碼變更:

圖片圖片

比較有趣的是,@rsc 和 @ianlancetaylor 的變更都是針對同一個 issues #4210:《cmd/go: go build does not reject importing commands》。

怎么后面又變了呢?@ianlancetaylor 給出的明確答復和定義:

圖片圖片

CL 4126053(原先 @rsc 提交的那次)是對描述語言規范的修改。該語言允許導入名為 main 的包。例如:在為使用 main 包的命令中的函數編寫單元測試時,就可以使用它。

但這里的問題是關于 Go 工具,而不是語言。問題是 go 工具是否應該允許軟件包導入定義命令的包。普遍的共識是不應該。

所提及的 Go 工具,覆蓋的范圍是:cmd/go。包含了 go build 等相關命令。因此是在受限制范圍的。

經過如此切分場景,就能知道為什么語言規范上沒有明確禁止。但 Go 工具上又明確拒絕了。因為其對應覆蓋了不同的使用場景。

不支持的原因,結合討論來看。

普遍認為支持 main 包的導入,會造成更大的復雜度和不安全性。

像是在 main 函數在編寫時,通常會假定自己擁有完全的控制權,因此多個 main 包內的函數引入,可能會造成在 init 函數的初始化順序、全局變量的注冊等,都會產生程序上的沖突。

總結

在本次對 Go 工具限制從 main 包中導入相關函數的緣由,我們做了詳盡的了解和分析。雖然 Go 官方這樣的方式可以一刀切的解決復雜度和安全性的問題。

但有歷史沉淀、債務的情況下,對于需要維護多個 Go 工程項目,要交付不同種類的可組合項目的程序員來說。相當于磨滅了一條道路。還是比較尷尬的。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2024-03-12 09:13:28

Go語言main

2021-10-27 07:15:36

Go 循環引用

2021-11-08 11:02:01

Go函數重載

2023-02-26 23:36:08

PHPGo函數

2021-12-09 10:51:47

Go繼承

2021-12-15 07:49:22

Go語言設計

2023-01-28 08:05:32

轉換Go泛型

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2024-05-28 08:55:52

2020-10-09 06:48:19

Pythonswitch語句

2020-07-22 08:01:41

Python開發運算符

2021-02-01 13:53:53

StringlongJava

2009-03-12 08:42:38

AndroidWMMTK

2021-06-11 00:03:31

鴻蒙智能手機

2021-08-02 09:31:20

Python工具代碼

2021-07-13 08:09:34

微博推特評論

2025-06-26 02:22:00

GoProtobuf標簽

2023-04-03 11:21:29

PythonGoRust

2009-03-11 17:32:22

聯發科WMAndroid
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 五月婷婷视频 | 99精品视频免费在线观看 | 成人中文网 | 欧美精品在线观看 | 日日噜| 欧美a在线 | 欧美视频成人 | 在线免费观看毛片 | 日韩成人在线播放 | 精品乱码一区二区三四区视频 | 精品一区久久 | 欧美激情在线观看一区二区三区 | 国产三级精品视频 | 日韩国产中文字幕 | 欧美在线一区二区三区 | 国产丝袜一区二区三区免费视频 | 91超碰在线观看 | 中文字幕在线观看一区 | 国产精品久久二区 | 亚洲精品成人 | 精品免费av| 在线观看h视频 | 亚洲国产成人精品女人久久久 | 国产 日韩 欧美 在线 | 免费观看a级毛片在线播放 黄网站免费入口 | 亚洲国产成人精品女人久久久野战 | 羞羞午夜 | 国产精品免费观看 | 亚洲人va欧美va人人爽 | 久久99精品久久久久久国产越南 | 日韩一区二区三区视频在线观看 | 99精品久久久久 | 免费视频二区 | 成人欧美一区二区三区黑人孕妇 | 国产精品一区二 | 国产一级视频在线观看 | 亚洲电影一区 | 久久一热 | 一区二区三区日韩精品 | 亚洲成人免费电影 | 91资源在线 |