本文同時發(fā)布在個人博客chinazt.cc 和 gitbook

今日看到了一個有趣的golang項目--kolpa(https://github.com/malisit/kolpa)。 這個項目可以用來生成偽造的姓名,地址,時間,User-Agent等等信息,在需要大量隨機數(shù)據(jù)的測試環(huán)境中非常合適。

點擊fork之后,放在本地環(huán)境中build,run結(jié)果失敗。運行項目中提供的demo也失敗,按道理來說官方提供的demo應(yīng)該都會成功,而且自己也沒有修改任何一行代碼,失敗是不科學(xué)的。

所以只能剖解代碼,查找失敗原因。

一查不知道,原來此項目需要依賴各個語言環(huán)境下的模板文件,而模板文件都放在項目的data目錄中。 在代碼中,通過硬編碼來確定模板文件位置:

// Reads the file "fName" and returns its content as a slice of strings.func (g *Generator) fileToSlice(fName string) ([]string, error) {var res []stringpath := os.Getenv("GOPATH") + "/src/github.com/malisit/kolpa/data/" + g.Locale + "/" + fName
file, err := os.Open(path)if err != nil {return nil, err
}defer file.Close()

scanner := bufio.NewScanner(file)for scanner.Scan() {
res = append(res, scanner.Text())
}if err := scanner.Err(); err != nil {//log.Println("Inteded generation is not valid for selected language. Switching to en_US.")return g.fileToSlice(fName)
}return res, nil}

因為我是通過fork,然后clone到本地的方式來運行demo,本地此時packge路徑已經(jīng)不是上面的路徑了,所以導(dǎo)致運行失敗。 很難說這是一個bug,但的確影響到了程序運行。 所以說不良的代碼風(fēng)格更為恰當(dāng)吧。

既然找到了問題,那下一步就是如何解決問題。 應(yīng)該如何在Runtime時實時獲取package位置呢?

說到Runtime,那么一定就少不了Reflect package。

Package reflect implements run-time reflection, allowing a program
        
		

網(wǎng)友評論