This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package g | |
import ( | |
"bytes" | |
"fmt" | |
"github.com/toolkits/file" | |
"os/exec" | |
"strings" | |
) | |
func GetCurrPluginVersion() string { | |
if !Config().Plugin.Enabled { | |
return "plugin not enabled" | |
} | |
pluginDir := Config().Plugin.Dir | |
if !file.IsExist(pluginDir) { | |
return "plugin dir not existent" | |
} | |
cmd := exec.Command("git", "rev-parse", "HEAD") | |
cmd.Dir = pluginDir | |
var out bytes.Buffer | |
cmd.Stdout = &out | |
err := cmd.Run() | |
if err != nil { | |
return fmt.Sprintf("Error:%s", err.Error()) | |
} | |
return strings.TrimSpace(out.String()) | |
} |
寫程式有一段時間了,有一些習慣問題,卻一直沒有深刻的認識。直到真的寫出 bug 以後,才會理解。
上方的例子,就是一個不好的例子。 GetCurrPluginVersion() 的傳回值,其實應該要有兩個資料型態,一個應該要用 string ,另一個應該要用 error 。而上頭的例子,只用一個 string 就裝了兩個不同資料型態的資料。這樣子讓使用 GetCurrPluginVersion() 的使用者,很容易潛意識地主觀認為,這個函數是一定會成功的,不會有 error 。於是,真的有 error 時,就一直穿透,直到很後期才發現。