今天遇見一個很蛋疼的問題,不知道是不是我配置的問題,IDE直接run就報錯。
問題描述
在開發代碼過程中,經常會因為邏輯處理而對代碼進行分類,放進不同的文件里面;像這樣,同一個包下的兩個文件,點擊idea的運行按鈕或者運行 go run main.go命令時,就會報錯,如圖所示。

那就好吧,我直接命令運行咯,go run main.go,一樣的結果。

IDE的配置,Run _kind:以file模式啟動就報錯,以package包模式就不會報錯。

醬紫就不會報錯了

原因分析
當然通過命令模式也會發現這樣蛋疼的問題,go build不報錯,直接go run main.go就報錯。
這事你得揪其因呀,出現蛋疼問題就得撫平咯,哈哈哈。
在源代碼的main函數中,我們發現從base.Commands的切片中獲取要執行的命令,然后和傳入的args一起執行cmd.Run(cmd, args)這個方法;

然后再回過頭看cmd.Run(cmd, args)這個函數,結果發現它只是定義了一種類型,具體實現這里沒有指出;
緊接着回頭去看run包下的函數,會發現run.go在初始化的時候,會把改文件下的runRun()函數賦值給base.Command{}定義的對象CmdRun,結果會發現runRun函數的的參數類型和個數完全符合cmd.Run(cmd, args)這個函數類型,在go語言中,函數的參數類型和參數個數符合定義的函數類型,則說明改函數實現了定義函數(注:go語言中,函數與方法不同)。

在runRun()函數中,會發現files和cmdArgs接收的是傳過來的文件列表,然后會通過GoFilesPackage(files),然后會入棧、加載、出棧等操作,由於啟動的時候傳遞的只是一個.go文件,並沒有傳遞demo.go,所以系統在加載main.go文件中並沒有找到compose.go 文件中定義的變量,則在
widget.NewToolbarAction(theme.MailComposeIcon(), func() {
newCompose(m.app, m.server).loadUI().Show()
}),
這一行,開始出錯。
正確操作:
該出錯原因屬於go的多文件加載問題,采用go run命令執行的時候,需要把待加載的.go文件都包含到參數里面。通過go run *.go(目錄里面沒有test.go才行)
或者配置IDE以package包模式就不會報錯。
