iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
0
Software Development

Emacs 來寫程式系列 第 22

[Emacs-22] 用 Emacs 來寫 Go 之範例篇

用 Emacs 來寫 Go

前面已經做完編輯 Go 程式的設定,我們這一篇來看在真正編輯 Go 程式時,可以使用到的各項功能

做一個函式庫

根據 Go 對於 workspace 的要求,我們在 $GOPATH/src/github.com/jerryhsieh/ 下先建立一個子目錄 myutil,然後建立一個檔案 main.go

src/github.com/jerryhsieh/
├── myproject
│   └── main.go
└── myutil
    └── main.go

先檢查一下設定

  • 對於語法檢查的部分,按 Ctrl-c ! v 來看 flycheck 的設定,Imgur
    可以看到 flycheck+go-golint 已經設定完成

  • 對於語法補全的部分,檢查 Ctrl-h v company-backends ,可以見到,我們設定的 (company-go company-files company-yasnippet company-capf) 已經在第一個選擇群組中 Imgur

使用 package myutil 來設定這個是一個 myutil 的函式庫,按 func 展開 yansippet

// name...
func name(args) {
}

打入 name ,註解的 name 會隨著改變,打入參數 (args) 跟 函式返回資料型態Imgur
Meta-x yas-describe-table 會顯示在 Go 模式下預設的程式片段 Imgur

繼續打入程式,當參考到參數時,自動補全會自動顯示 Imgur
移動游標時,小緩衝區的 Eldoc 會顯示這個參數的資料型態

使用 Meta-x company-diag 來看 Company 的執行情況 Imgur

我們接著寫第二個函式,假設這次故意漏掉函式返回的資料型態,flycheck 會用粉紅色顯示這個錯誤,並在小緩衝區顯示錯誤的原因 Imgur

Ctrl-c ! l 來看語法錯誤跟警告訊息 Imgur

修改完畢後,存檔,這時 gofmt 會自動排版然後儲存

安裝函式庫

使用 go install 來安裝函式庫,這時,會在 $GOPATH 下產生一個 pkg 子目錄,裡面會有 myutil.a 的函式庫 Imgur

寫一個主函式

在 $GOPATH/src/github.com/jerryhsieh/ 下先建立一個子目錄 myproject,建立一個程式 main.go
因為是執行檔,所以 pakcage 是 main
使用 Ctrl-c Ctrl-a 來做函式庫的 import Imgur
import "fmt"

Ctrl-c Ctrl-a 會執行 go-import-add Imgur

打入 main 會展開

func main() {
}

打入 fmt.P 會自動補全 P 開頭的函式 Imgur

接著打完 fmt.Println("Hello") ,我們試把 import 刪除 Imgur
按下 Ctrl-x Ctlr-s 存檔時,goimport 會將 import "fmt" 自動加入 Imgur

現在來 import 我們剛寫的函式庫,按Ctrl-c Ctrl-a ,在 ivy-mode 下打入 my 就可以看到那個函式庫 Imgur

import 進來後,就可以使用自動補全來展開我們寫的函式 Imgur
同時也會帶出參數的資料型態 Imgur

跳到函式定義,使用 godef Ctrl-c Ctrl-j Imgur
godef-jump-to-other-window 會顯示獨立的視窗 Imgur

Guru 功能

使用 Guru 前,須先設定 scope 可以使用下列函式

(defun my/go-guru-set-current-package-as-main ()
    "GoGuru requires the scope to be set to a go package which
     contains a main, this function will make the current package the
     active go guru scope, assuming it contains a main"
    (interactive)
    (let* ((filename (buffer-file-name))
           (gopath-src-path (concat (file-name-as-directory (go-guess-gopath)) "src"))
           (relative-package-path (directory-file-name (file-name-directory (file-relative-name filename gopath-src-path)))))
      (setq go-guru-scope relative-package-path)))

執行 Meta-x my/go-guru-set-current-package-as-main 來設定 scope
這樣就可以執行 Guru 的功能,例如 guru-describe 使用 Ctrl-c Ctrl-o d Imgur

執行結果如圖,會有這個函式的定義所在等等資訊 Imgur

執行程式

可以在 emacs shell 下執行 go run Imgur
也可以在 go install 完後,直接執行 myproject Imgur

相關影片
相關簡報: 簡報
相關程式: Github 請下載到 ~/.emacs.d/ 下,啟動 Emacs 就會自動安裝
相關資訊: 我的部落格


上一篇
[Emacs-21] 用 Emacs 來寫 Go 設定篇
下一篇
[Emacs-23] 用 Emacs 來寫 Ruby 設定篇
系列文
Emacs 來寫程式30

尚未有邦友留言

立即登入留言