🔑 Go 可见性规则|大小写决定一切!新手必懂

2026-05-30 58 0

本篇基于 Go 1.25.1 版本,一次性讲透 Go 语言公有/私有核心规则,大小写控制访问权限,新手秒懂✅


一、Go 可见性终极规则(只有 1 条!)

Go 语言没有 public/private 关键字,完全靠大小写控制可见性:

大写开头 = 公开(公有)

包外可以访问

小写开头 = 私有

只有本包内部可以访问

就是这么简单!


二、可见性规则对照表(收藏)

命名方式权限包外可访问?示例
大写开头公开(Exported)✅ 可以User GetName() Age
小写开头私有(Unexported)❌ 不可以user getName() age

三、哪些东西受可见性控制?

全都是统一规则👇

  • • 变量、常量
  • • 函数、方法
  • • 结构体、字段
  • • 接口、方法

四、超清晰实战 Demo(多包结构)

项目结构

demo/
├── go.mod
├── main.go        # 主包(main)
└── user/
    └── user.go    # user 包

1. user/user.go(定义公开+私有)

// user 包:演示可见性规则
package user

import "fmt"

// ========== 大写开头:公开(包外可访问) ==========

// User 公开结构体
type User struct {
    Username string // 公开字段
    password string // 私有字段(包外无法访问)
}

// GetUserInfo 公开函数
func GetUserInfo() User {
    return User{
        Username: "Go学习者",
        password: "123456",
    }
}

// ========== 小写开头:私有(仅包内可用) ==========

// printSecret 私有函数
func printSecret() {
    fmt.Println("私有方法,仅内部可调用")
}

2. main.go(主包调用测试)

package main

import (
    // 导入 user 包
    "demo/user"
    "fmt"
)

func main() {
    fmt.Println("=== 1. 调用公开函数 ===")
    u := user.GetUserInfo()
    fmt.Println("用户名:", u.Username)

    // 报错!password 小写=私有,无法访问
    // fmt.Println(u.password)

    fmt.Println("\n=== 2. 调用公开结构体 ===")
    newUser := user.User{
        Username: "新用户",
        // password: "xxx", // 报错!
    }
    fmt.Println("新用户:", newUser)

    // 报错!printSecret 小写=私有
    // user.printSecret()
}

五、运行命令 & 结果

# 初始化模块
go mod init demo

# 运行
go run main.go

输出:

=== 1. 调用公开函数 ===
用户名: Go学习者

=== 2. 调用公开结构体 ===
新用户:{新用户 }

六、高频重点总结

1. 结构体字段规则

  • 大写字段:外部可读写
  • 小写字段:外部不可读写(私有)

2. 包外只能“看到”大写成员

  • • 小写函数、变量、结构体 → 包外看不见、调用报错

3. 设计原则

  • • 对外提供功能:大写
  • • 内部工具逻辑:小写

七、新手最常见错误

// 错误!调用小写私有成员
user.printSecret()
u.password

// 错误!导入的包访问不到小写成员

📌 总结

  1. 1. 大写开头 = 公开:包外可访问
  2. 2. 小写开头 = 私有:仅本包可用
  3. 3. Go 无 public/private,大小写就是权限
  4. 4. 结构体字段、函数、变量规则完全一致

一篇搞定 Go 可见性规则,写包、封装、模块化再也不懵✨

 

相关文章

🚨 Go 变量遮蔽|新手最容易踩的隐形坑!一篇避坑
🌍 Go 变量作用域全解|全局·局部·块作用域一次吃透
🔍 Go 空白标识符 _ 全攻略|忽略值·导包神器用法大全
🚀 Go main 函数详解|程序入口核心玩法全掌握
🚀 Go init 函数详解|程序初始化的秘密入口
🔍 Go 类型断言基础|空接口类型判断一学就会!

发布评论