Menu
CoddyTech

导出名称与未导出名称

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 4 课,共 107 课。

在 Go 中,名称的首字母决定了它的可见性。以大写字母开头的名称是导出的(可从其他包访问)。以小写字母开头的名称是未导出的(仅在该包内可访问)。

导出名称:在包外可见

type User struct {
    Name  string  // 导出的字段
    Email string  // 导出的字段
}

func CreateUser(name string) User { // 导出的函数
    return User{Name: name}
}

未导出的名称:仅在包内可见

type secret struct {     // 未导出的结构体
    password string      // 未导出的字段
}

func validate() bool {   // 未导出的函数
    return true
}

混合:包含一些未导出字段的导出结构体

type Account struct {
    Username string    // 已导出,可在任何地方访问
    Email    string    // 已导出,可在任何地方访问
    password string    // 未导出,只能在包内访问
}

这种命名约定取代了其他语言中的 public 和 private 等访问修饰符。

// 大写字母 = 可导出(公开)
// 小写字母 = 不可导出(私有)

func SaveData() {}  // 可导出
func loadData() {}  // 不可导出

在 Go 中,遵循这一约定至关重要。其他包导入你的代码时,只能访问以大写字母开头的名称。

challenge icon

挑战

中等

将 product.go 中的所有名称改为符合 Go 的导出命名约定。将以下名称的首字母大写:

  • 结构体名称:product → Product
  • 所有字段名称:name、price、stock
  • 所有函数名称:totalValue、displayInfo
  • 函数中的所有字段引用

亲手试试

package main

import "fmt"

func main() {
    var name string
    var price float64
    var stock int
    fmt.Scan(&name, &price, &stock)

    p := Product{
        Name:  name,
        Price: price,
        Stock: stock,
    }

    fmt.Println(DisplayInfo(p))
    fmt.Printf("Total Value: %.2f\n", TotalValue(p))
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器