Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新行的gofmt保持_Go_Gofmt - Fatal编程技术网

新行的gofmt保持

新行的gofmt保持,go,gofmt,Go,Gofmt,使用gofmt格式化go源代码时,它会保留换行符,以便您可以将项目分组在一起。我对如何实际实现这一点很感兴趣。我试图查看github repogolang/go中的源代码,但无法立即找到它。如果你看: 打印机如何知道源中存在这些额外的换行符? 有人能给我指一下正确的方向吗?在内部。转到`第40-41行,这是: //插入时使用;,不是换行符,所以行号 //在psrc中,与src中的匹配 然后这个: psrc := append([]byte("package p;"), src...) file,

使用gofmt格式化go源代码时,它会保留换行符,以便您可以将项目分组在一起。我对如何实际实现这一点很感兴趣。我试图查看github repo
golang/go
中的源代码,但无法立即找到它。如果你看:

打印机如何知道源中存在这些额外的换行符?
有人能给我指一下正确的方向吗?

内部。转到
`第40-41行,这是:

//插入时使用;,不是换行符,所以行号

//在psrc中,与src中的匹配

然后这个:

psrc := append([]byte("package p;"), src...)
file, err = parser.ParseFile(fset, filename, psrc, parserMode)

这就是你要找的吗?如果我没弄错你的问题。

内部。转到
`第40-41行,这里有:

//插入时使用;,不是换行符,所以行号

//在psrc中,与src中的匹配

然后这个:

psrc := append([]byte("package p;"), src...)
file, err = parser.ParseFile(fset, filename, psrc, parserMode)

这就是你要找的吗?如果我没弄错的话。

与大多数lexer不同,go lexer包含的标记通常会被编译器的lexer删除或省略。lexer发出的标记流包括注释标记、隐含分号、换行符、formfeed(FF)和其他空格。这允许使用相同的令牌流重新生成源代码,并创建编译器所需的结构,如AST。

与大多数lexer不同,go lexer包含的令牌通常被编译器的lexer删除或省略。lexer发出的标记流包括注释标记、隐含分号、换行符、formfeed(FF)和其他空格。这允许使用相同的令牌流重新生成源代码,并创建编译器所需的结构,如AST。

gofmt在AST上工作。当您查看时,您将看到每个节点都有函数Pos()和End(),它们分别返回开始和结束的token.Pos。这些基本上是源文件中的偏移量,因此对行号/换行符一无所知

但是当与token.Fileset组合时,这样的token.Pos可以转换为包含行号的token.Position。gofmt在函数printer.go:lineFor()中执行此操作

换行符的实际插入在节点中完成。go:linebreak()。linebreak()的第一个参数是通过在相应的token.Pos上调用前面提到的lineFor()获得的行号。该函数计算此行号与上次打印的标记行号之间的差值(在struct printer的pos字段中跟踪)。这将告诉它现在要打印的令牌是否与前一个令牌位于输入文件中的同一行。如果不是,这意味着程序员在原始源代码中包含一个或多个换行符,linebreak()将最多输出一个空行。虽然它可以保留所有的输入换行符,但gofmt的策略是将一系列空行压缩到只有一个空行


如果你问这个问题的原因是你想定制gofmt,那么看看gofmt在AST上的工作原理。当您查看时,您将看到每个节点都有函数Pos()和End(),它们分别返回开始和结束的token.Pos。这些基本上是源文件中的偏移量,因此对行号/换行符一无所知

但是当与token.Fileset组合时,这样的token.Pos可以转换为包含行号的token.Position。gofmt在函数printer.go:lineFor()中执行此操作

换行符的实际插入在节点中完成。go:linebreak()。linebreak()的第一个参数是通过在相应的token.Pos上调用前面提到的lineFor()获得的行号。该函数计算此行号与上次打印的标记行号之间的差值(在struct printer的pos字段中跟踪)。这将告诉它现在要打印的令牌是否与前一个令牌位于输入文件中的同一行。如果不是,这意味着程序员在原始源代码中包含一个或多个换行符,linebreak()将最多输出一个空行。虽然它可以保留所有的输入换行符,但gofmt的策略是将一系列空行压缩到只有一个空行


如果你问这个问题的原因是你想定制gofmt,那么看看

不是真的,我在寻找
//如果在源代码中存在额外的换行符,那么在源代码中穿插额外的换行符
打印机如何知道这些额外的换行符在源代码中存在?不是真的,我的目标是
//如果源代码中存在额外的换行符,则在其中穿插这些换行符
打印机如何知道源代码中存在这些额外的换行符?感谢您的回复!在哪里可以找到换行符?似乎不包含特定的换行符。感谢您的回复!在哪里可以找到换行符?似乎不包含特定的换行符。感谢您的详细回复!这正是我想要的汉克斯的精心回应!正是我想要的