我正在通过声明类型
来测试Go对Unicode的支持type Эксперимент struct {
Строка string
}
在package испытание
中,并尝试导入单元测试。但是,当我尝试这个时,我收到一个错误。
跟踪:
$ go test
# github.com/mcandre/mcandre/go/испытание_test
./испытание_test.go:10: undefined: Эксперимент
FAIL github.com/mcandre/mcandre/go/испытание [build failed]
来源:
https://github.com/mcandre/mcandre/tree/master/go/испытание
我是否正确地将公众成员资本化? go doc
显示我的结构公开列出:
$ go doc
package испытание // import "github.com/mcandre/mcandre/go/испытание"
Package испытание demonstrates Unicode capabilities in Go source code.
type Эксперимент struct { ... }
func Испытание() Эксперимент
也许Go编译器在令牌中有西里尔符文的问题?
答案 0 :(得分:2)
如果标识符名称的第一个字符是Unicode大写字母(Unicode类" Lu"),则导出标识符;和[...]
西里尔符文(Go处理得很好)没有任何问题,Unicode类中的所有字符都是" Lu" (Letter,uppercased)被接受,但是当您导入包时,您必须使用包名来构造qualified identifiers以从包中引用exported identifiers。
在测试中更改此行:
wanted := Эксперимент{Строка: "Испытание!"}
对此:
wanted := испытание.Эксперимент{Строка: "Испытание!"}
一旦你这样做,它就会通过。正在运行go test
:
PASS
ok github.com/mcandre/mcandre/go/испытание 0.001s
有关详细信息,请参阅此相关问题:Getting a use of package without selector error
您需要使用限定标识符,因为您为测试文件使用了不同的包。您可以选择使用相同的包,在这种情况下,您不得导入包(这将是一个不允许的导入循环),在这种情况下,您不需要使用合格的标识符,您可以使用包的所有导出的和未导出的标识符。
这是使用相同包的测试文件的样子:
package испытание
import (
"testing"
)
func TestИспытаниеReturnsИспытание(t *testing.T) {
wanted := Эксперимент{Строка: "Испытание!"}
observed := Испытание()
if observed != wanted {
t.Errorf("испытание.Испытание(): Wanted %s, got %s\n", wanted, observed)
}
}
使用相同的包名称称为白盒测试,使用不同的包名称称为黑盒测试。您可以在此处详细了解:Where to put shared code for tests in a Go package?
使用import declarations,您还可以更改要用于引用导入的包标识符的名称;您甚至可以使用.
(点)代替名称,在这种情况下,您可以省略限定标识符中的名称。有关详细信息,请参阅:Import struct from another package and file golang