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:自定义编译后可执行文件输出路径。
相关推荐
码农大叔的博客9 小时前
golang示例:switch
开发语言·后端·golang
圣殿骑士-Khtangc12 小时前
Go面试核心考点之GMP调度器源码级深度解析
golang
xcLeigh1 天前
Go入门:无类型常量与类型常量的区别
服务器·开发语言·golang
泡沫冰@1 天前
GO 语言基础
开发语言·算法·golang
骇客野人1 天前
电商商城微服务架构设计方案(SpringCloud/Go+Vue3+MySQL+ES+RocketMQ)
spring cloud·微服务·golang
码农大叔的博客1 天前
golang示例:for九九乘法表
开发语言·算法·golang
圣殿骑士-Khtangc1 天前
Go-sync-Pool对象池最佳实践与源码分析
golang
互联网中的一颗神经元1 天前
01. Go 内存管理全景架构
java·jvm·golang
有脚就行1 天前
第24篇-Go-gRPC推理服务-高性能跨语言通信
开发语言·人工智能·后端·golang
圣殿骑士-Khtangc2 天前
Go-Mutex源码解析从自旋到饥饿模式的完整演进
golang