go在包level支持标识符的公开或者隐藏.

关于如何公开还是不公开的规则很简单, 如果要公开包里的类型, 或者方法, 参数, 只需要将该类型, 方法, 参数的首字母大写. 也就是说, 当包里的标识符首字母大写时, 那么其它包就可以调用该标识符, 如果是小写, 那就不可调用.

基本可以概括成下面 几种case.

package model

// userA 未公开, 因为首字母小写,
type userA struct {
    Email string    // 未公开, 因为外部类型userA未公开
    name  string    // 未公开
}

// 未公开, 因为接收者 *ua 未公开
func(ua *userA) Email() string{
    return ua.Email
}

// UserB 公开
type UserB struct{
    Email string    // 公开
    name string     // 未公开
}

// Email 方法公开
func (ub *userB) Email() string{
    return ub.Email
}

// updateEmail 未公开
func (ub *userB) updateEmail (newEmail string) {
    ub.Email = newEmail
}
// c 未公开, 因为c小写
var c UserB

// D 公开, D大写, 外部能访问D.Email, 但不能访问D.name
var D UserB

// E 公开, 外部能访问E.Email 但不能访问E.name
var E userA

关于export & unexport 标识符, 基本就这些, 但一个比较好的go practice是, 任何被公开的标识符, 都应该给其加上documentation说明其作用.


附第5章小结:

  • 使用关键字struct 或者通过重命名已存在的类型, 可以自定义用户类型.
  • 方法提供了一种给用户定义的数据类型增加行为的方式.
  • 设计类型是需要确认类型的本质是原始的还是非原始的(可改动).
  • 接口是声明了一组行为并支持多态的抽象类型.
  • 类型嵌入提供了扩展已有类型的能力, 而无需使用继承.
  • 标识符要么是从包里公开的, 要么是未公开的, 通过首字母大小写来达到公开未公开效果.