2016-04-16 23 views
3

作为一名初学者,无论何时我开始一个新的源文件,这总是让我感到满意。所以去包的子句定义包名称,没有双引号,因为包名称必须是一个标识符,它不能包含空间或其他东西无效的字符。但是,对于导入声明,包名称必须用双引号引起来,因为包名称正好是包含子句中使用的包名称,它也必须是标识符(当然/可以作为分隔符)。它看起来只会增加更多击键而没有其他好处。我想知道为什么它是这样设计的,即导入必须是双引号字符串。为什么要求双引号导入声明

此外,如果我们看看其他语言,#include <foo.h>,using System.Bar,import java.lang.moo它们都不需要导入字符串。

+5

[在Go的导入语句中使用引号的原因是什么?](http://programmers.stackexchange.com/questions/307417/what-was-the-reason-behind-using-quotes-in-gos-导入语句) –

+0

哦,所以它被保留用于该语言的其他实现的潜力? – fluter

+0

这似乎是该主题中的共识。 –

回答

3

路径a/b/foo比标识符更像字符串:标识符没有分隔符,路径可能包含标识符中不允许使用的字符。你说包名不能包含空格,这是真的,但路径可以,正如包名不能包含句点(.),但路径可以。例如:

import "golang.org/x/exp/shiny/vendor/github.com/BurntSushi/xgb/render"` 

这主要是同C,这是在这个问题列为不使用字符串指定#include路径,但与去import语句股相似之处。这两种形式都是类似字符串的:#include <a/b/foo.h>#include "a/b/foo.h",但是使用<>而不是引号来分隔字符串。

+0

导入路径不能只是任意文件系统路径,因为路径中的部分正好是package子句中定义的标识符。路径中的标识符中唯一不允许使用的字符是分隔符'/'。 – fluter

+0

@弗吕特我不知道你在说什么。 “路径中的部分与包装条款中定义的标识完全相同”是什么意思? 'golang.org/x/exp/shiny/vendor/github.com/BurntSushi/xgb/render'中的部分是'golang.org','x','exp',...'render',后半部分('render')是包名,例如'golang.org'和'github.com'是go中的路径的一部分,但是有效的标识符。 –

+0

你是对的,导入路径在语言规范中定义为'ImportPath = string_lit .'。谢谢。 – fluter

相关问题