Go 工程管理与作用域

1 获取命令行参数

核心说明

程序接收外部传入的命令行参数,全部以字符串类型存储。

go

Go 复制代码
// 获取全部命令行参数列表
list := os.Args
// 获取参数总个数
n := len(list)
fmt.Println("参数总数 n = ", n)

2 变量作用域

2.1 局部变量 & 全局变量

  1. 局部变量 定义在{}代码块内部的变量,仅当前代码块生效;程序执行到变量定义语句时分配内存,离开代码块(作用域)自动释放内存。
  2. 全局变量定义在所有函数外部的变量,整个包内均可访问。

2.2 不同作用域同名变量规则

go

Go 复制代码
// 全局变量 a
var a byte
func main() {
    // 局部变量 a,与全局同名
    var a int
    // 变量查找遵循就近原则,优先使用局部a
    fmt.Printf("%T\n", a)
}

两条核心规则:

  1. 不同作用域下,允许定义名称相同的变量;
  2. 变量查找遵循就近原则,优先使用当前作用域内的变量。

3 Go 工程管理(GOPATH 工作区)

3.1 工作区三大目录

大型项目不能全部写在main函数内,需要按功能拆分代码,依靠 GOPATH 工作区管理:

  1. src:存放所有源代码,Go 命令强制要求源码必须放在 src 下;
  2. pkg:编译生成的静态库文件,无需手动创建,go 工具自动生成;
  3. bin:编译生成的可执行程序,无需手动创建,go 工具自动生成。

导入包时,默认从GOPATH下的 src 目录查找对应代码。

3.2 包 package 基础

  1. 程序入口文件必须声明 package main
  2. 使用import导入外部包,导入后必须使用,否则编译报错。
三种导入写法
  1. 单行导入

go

Go 复制代码
import "fmt"
import "os"
  1. 批量括号导入(推荐)

go

Go 复制代码
import (
    "fmt"
    "os"
)
  1. 特殊导入语法

go

Go 复制代码
// 点导入:调用包内函数时,省略包名直接调用
import . "fmt"

// 包别名:给长包名自定义简写
import io "fmt"

// 空白导入:仅执行包内init函数,不使用包内任何标识符
import _ "fmt"

3.3 同目录 / 不同目录代码调用规则

① 同一目录(分文件编程)
  1. 多个源码文件放在src下同一个文件夹;
  2. 同目录所有文件包名必须完全一致
  3. 同目录文件互相调用函数,直接写函数名,不需要加包名;
  4. 使用go env查看本机 GOPATH、GOBIN 等环境变量。
② 不同目录(跨包调用)

目录结构示例:

plaintext

Go 复制代码
src/
├─ main.go
└─ calc/
   └─ calc.go

规则:

  1. 不同目录,包名必须不同;
  2. 跨包调用语法:包名.函数名()
  3. 包外可访问的函数 / 变量,首字母必须大写导出;小写标识符仅当前包可见。

3.4 main 函数与 init 函数执行顺序

  1. 执行优先级:先执行所有包的 init (),再执行 main ()
  2. 空白导入import _ "xxx"用途:仅触发目标包的 init 函数执行,不需要使用包内任何变量;

go

Go 复制代码
import (
    // 仅执行fmt包init,代码中不使用fmt任意方法
    _ "fmt"
)

3.5 工程环境配置步骤

  1. 配置GOPATH环境变量:值为 src 目录同级的工作区绝对路径;
  2. 可选配置GOBIN:自定义编译后可执行文件输出路径。
相关推荐
进击的程序猿~10 小时前
Go Zero源码阅读1
后端·golang
李燚17 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
Generalzy20 小时前
从 Web 页面到桌面应用:用 Go + WebView 构建一个轻量级桌面框架
开发语言·前端·golang
灯澜忆梦1 天前
GO_函数_2
开发语言·golang·xcode
灯澜忆梦1 天前
Go 语言圣经 5 | 函数全解:声明、签名、闭包、Defer、Panic 错误处理
数据结构·算法·golang
进击的程序猿~1 天前
Go Zero源码阅读2
开发语言·后端·golang
zenithdev12 天前
fastcache:为 Go 设计的低 GC 压力内存缓存
开发语言·其他·缓存·golang
北冥you鱼2 天前
Go语言sync包在区块链开发中的数据同步实践
golang·centos·区块链
布朗克1682 天前
Go 入门到精通-13-指针与内存
开发语言·c++·golang·指针与内存