不能指未导出的名称m.β

时间:2014-08-27 02:01:23

标签: unicode go packages

看看这两个简单的包:

package m
const β = 1

package main
import ("m";"fmt")
func main() {
    fmt.Println(m.β)
}

当我尝试编译它时出现此错误:

$ GOPATH=`pwd` go run a.go 
# command-line-arguments
./a.go:4: cannot refer to unexported name m.β
./a.go:4: undefined: m.β

为什么呢?我尝试用两个包中的B替换β,它可以工作,但我试图在这里使用正确的符号。也许这两个软件包出于某种原因使用了同形字或不同的编码?

4 个答案:

答案 0 :(得分:11)

go规范说明如果

导出标识符
  

标识符名称的第一个字符是Unicode大写   字母(Unicode类“Lu”)

https://golang.org/ref/spec#Exported_identifiers

func main() {
    fmt.Println(unicode.IsUpper('β'))
}

返回

false

http://play.golang.org/p/6KxF5-Cq8P

答案 1 :(得分:3)

β是小写的,因此不会导出,也不能从该包外部使用。

fmt.Println(unicode.IsLower('β'))

playground

答案 2 :(得分:1)

导出包中的函数,方法需要以大写字母开头。昨天遇到同样的问题Error in importing custom packages in Go Lang

答案 3 :(得分:1)

导出的标识符名称的第一个字符必须是Unicode大写字母。例如,

package main

import (
    "fmt"
    "unicode"
)

const Β = 1

func main() {
    const (
        GreekLowerβ = 'β'
        GreekUpperΒ = 'Β'
    )
    fmt.Println(GreekLowerβ, unicode.IsUpper(GreekLowerβ))
    fmt.Println(GreekUpperΒ, unicode.IsUpper(GreekUpperΒ))
}

输出:

946 false
914 true

  

The Go Programming Language Specification

     

Exported identifiers

     

可以导出标识符以允许从另一个标识符访问它   包。如果两者都导出标识符:

     
      
  1. 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);和
  2.   
  3. 标识符在包块中声明,或者是字段名称或方法名称。
  4.         

    不会导出所有其他标识符。


Greek alphabet:ββbetal