本文同时发布在个人博客chinazt.cc 和 gitbook
今日看到了一个有趣的golang项目--kolpa(https://github.com/malisit/kolpa)。 这个项目可以用来生成伪造的姓名,地址,时间,User-Agent等等信息,在需要大量随机数据的测试环境中非常合适。
点击fork之后,放在本地环境中build,run结果失败。运行项目中提供的demo也失败,按道理来说官方提供的demo应该都会成功,而且自己也没有修改任何一行代码,失败是不科学的。
所以只能剖解代码,查找失败原因。
一查不知道,原来此项目需要依赖各个语言环境下的模板文件,而模板文件都放在项目的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路径已经不是上面的路径了,所以导致运行失败。 很难说这是一个bug,但的确影响到了程序运行。 所以说不良的代码风格更为恰当吧。
既然找到了问题,那下一步就是如何解决问题。 应该如何在Runtime时实时获取package位置呢?
说到Runtime,那么一定就少不了Reflect package。
Package reflect implements run-time reflection, allowing a program