我正试图在Go中创建git的克隆。我是围棋新手,尤其是围棋;os";以及";io";包裹。
问题:为什么我的函数在输出的开头返回一个内存地址(或者可能是读取的字节数?(?有没有办法把它从输出中删除,这样我就能得到预期的输出?
预期输出:dumpty vanilla dooby humpty donkey yikes
得到:blob 40x00dumpty vanilla dooby humpty donkey yikes
命令:./my_git.sh cat-file -p <HASH>
相关代码:
if os.Args[2] == "-p" {
// Declare SHA
sha := os.Args[3]
// Convert SHA to readable file path
folder := string(sha[0:2])
blob := string(sha[2:])
filePath := ".git/objects/" + folder + "/" + blob
file, err := os.Open(filePath)
if err != nil {
log.Fatal(err)
}
r, readError := zlib.NewReader(file)
if readError != nil {
log.Fatal(readError)
}
io.Copy(os.Stdout, r)
r.Close()
}
blob 40x00
实际上是(解压缩的(文件内容的一部分。它是对象标题:
- 对象的类型(这里的"blob";例如,其他类型包括"commit"one_answers"tree"(
- 对象的大小(以字节为单位((此处为40(
- 和一个空字节
你不能只是删除它。您必须理解标题才能正确理解对象内容。
参见";Git内部-Git对象;有关进一步信息,请参阅git手册的第章。