标识符通过大小写来区分是否公开,
没有公开 的标识符只能在本包使用,别的包无法使用,

工厂模式解决问题

代码

src\go_code\pubsymbol\main\main.go

  1. package main
  2. import (
  3. "fmt"
  4. // 引包
  5. "go_code/pubsymbol/counters"
  6. "go_code/pubsymbol/model"
  7. )
  8. func main() {
  9. // 创建一个未公开类型的变量,并初始化为10
  10. counter := counters.New(10)
  11. fmt.Printf("counter类型:%T, 值:%v \n ", counter, counter) // counter类型:counters.AlertCounter, 值:10
  12. // 创建 Student 结构体变量
  13. /* stu := model.Student{
  14. Name: "tom",
  15. Age: 2,
  16. } */
  17. stu := model.NewStudent("tom02", 3)
  18. fmt.Println("stu = ", *stu) // {tom02 3}
  19. fmt.Println("stu.Name = ", stu.Name) // tom02
  20. fmt.Println("stu.score = ", stu.GetScore()) // 没有赋值, 默认零值 0fmt.Println("stu = ", *stu) // {tom02 3}
  21. }

src\go_code\pubsymbol\counters\counters.go

  1. package counters
  2. // alertCounter 是一个未公开的类型,用于保存告警次数
  3. type alertCounter int
  4. // 工厂函数
  5. // New 创建并返回一个未公开的 alertCounter 类型的值
  6. func New(value int) alertCounter {
  7. return alertCounter(value)
  8. }

src\go_code\pubsymbol\model\model.go

  1. package model
  2. // 公开 Student 结构体变量
  3. type student struct {
  4. Name string
  5. Age int
  6. score float64 // 未公开的字段,怎么在别包获取?
  7. }
  8. func NewStudent(name string, age int) *student {
  9. return &student{
  10. Name: name,
  11. Age: age,
  12. }
  13. }
  14. // 创建一个对外公开的方法,返回其私有的字段 score
  15. func (stu *student) GetScore() float64 {
  16. return stu.score
  17. }

代码解读

  1. 将工厂函数命名为New是Go语言的一个习惯,这个New函数做了一些有意思的事情:创建了一个未公开的类型的值,并将这个值返回给调用者。
  2. 标识符才有公开或者未公开的属性,值没有。