经常在Go和Rust之间切换，很喜欢Rust的Cargo带来的优秀项目初始化和构建体验：cargo new <appName> # 一键创建标准项目 cargo build # 统一构建流程但回到Go时，虽然go mod很好，但项目初始化、结构规范、构建优化这些事，总是要手动操作。于是，通过将Cargo的部分理念带到Go生态中。通过倒反天罡，写了gocar：简化Go项目“创建-构建”流程的命令行工具。它不替代go命令，而是作为补充，提供更一致、更便捷的起点。项目已开源：https://github.com/uselibrary/gocar以下是当前的示例，欢迎PR/issue：快速开始# 创建新项目（简洁模式） gocar new myapp # 进入项目目录 cd myapp # 构建项目 gocar build # 运行项目 gocar run # 清理构建产物 gocar clean命令gocar new <name> [--mode simple|project]创建新的 Go 项目。参数：<name> - 项目名称，同时作为目录名和输出的可执行文件名--mode - 项目模式，可选 simple（默认）或 project项目名规则：必须以字母开头只能包含字母、数字、下划线 _ 或连字符 -不能使用保留名称：test、main、init、internal、vendor示例：# 创建简洁模式项目（默认） gocar new myapp # 创建项目模式项目 gocar new myserver --mode projectgocar build [--release]构建当前项目。参数：--release 可选，使用之后即以CGO=0模式构建并优化体积构建行为：模式命令等价Debug（默认）go build -o bin/<appName> ./main.goReleaseCGO_ENABLED=0 go build -ldflags="-s -w" -trimpath -o bin/<appName> ./main.go项目模式下入口为 ./cmd/server/main.go示例：# Debug 构建 gocar build # Release 构建（CGO=0模式构建并优化体积） gocar build --releasegocar run [args...]直接运行当前项目（使用 go run）。示例：# 运行项目 gocar run # 传递参数给应用 gocar run --port 8080gocar clean清理 bin/ 目录中的构建产物。示例：gocar clean # Cleaned build artifacts for 'myapp'gocar help显示帮助信息。gocar version显示版本信息。项目模式简洁模式（Simple）适用于小型项目、脚本、CLI 工具等。myapp/ ├── go.mod ├── main.go ├── README.md ├── bin/ ├── .gitignore └── .git/main.go 模板：package main import ( "fmt" "time" ) func main() { fmt.Println("Hello, gocar! A golang package manager.") fmt.Println(time.Now().Format("2006-01-02 15:04:05")) }项目模式（Project）适用于大型项目、Web 服务、微服务等，遵循 Go 标准项目布局。myapp/ ├── cmd/ │ └── server/ │ └── main.go # 应用入口 ├── internal/ # 私有代码（不可被外部导入） ├── pkg/ # 公共库代码 ├── test/ # 集成测试 ├── bin/ # 构建输出 ├── go.mod ├── README.md ├── .gitignore └── .git/cmd/server/main.go 模板：package main import ( "fmt" "time" ) func main() { fmt.Println("Hello, gocar! A golang package manager.") fmt.Println(time.Now().Format("2006-01-02 15:04:05")) }目录说明：cmd/ - 应用程序入口internal/ - 私有代码，仅本模块内部使用（Go 编译器强制）pkg/ - 可被外部项目导入的公共库test/ - 集成测试、端到端测试特性自动 Git 初始化 - 创建项目时自动执行 git init -b main 并生成 .gitignore，需要已经安装git项目名验证 - 确保项目名符合 Go 规范Release 优化 - 使用 -ldflags="-s -w" -trimpath 减小二进制体积跨平台支持 - AMD64及aarch64的Windows、Linux 和 macOS清理命令 - 一键清理构建产物
Golang编译命令CGO_ENABLED=0 go build -ldflags="-s -w" -trimpath -o myappCGO_ENABLED=0:纯静态二进制，避免动态库依赖-s:strip symbol table 去除符号表-w:strip DWARF debug info 去除调试信息-trimpath：去除路径信息Rustmusl静态编译命令cargo build --target x86_64-unknown-linux-musl --release首次编译，需要安装muslrustup target add x86_64-unknown-linux-musl编辑Cargo.toml文件，剥离调试和符号信息，类似Golang的-s -w[profile.release] strip = "symbols"编辑.cargo/config.toml文件，移除路径信息[build] rustflags = [ "--remap-path-prefix", "--remap-path-prefix-from=${CARGO_MANIFEST_DIR}", "--remap-path-prefix-to=." ]推荐的 Go 项目结构（基于 Go Modules）my-project/ # 项目根目录（包含 go.mod） ├── go.mod # Go 模块声明（必需） ├── go.sum # 依赖校验和（自动生成） ├── README.md ├── Makefile # （可选）构建/测试脚本 ├── .gitignore ├── .golangci.yml # （可选）golangci-lint 配置 ├── cmd/ # 入口点（main 函数所在） │ └── server/ # 每个可执行程序一个子目录 │ └── main.go # package main，调用 internal/app ├── internal/ # 私有代码（不能被外部项目 import） │ ├── app/ # 应用核心逻辑（业务层） │ │ └── server.go │ ├── config/ # 配置加载 │ ├── handler/ # HTTP/gRPC 处理器 │ ├── service/ # 业务服务（如 UserService） │ ├── repository/ # 数据访问层（DB、缓存等） │ └── middleware/ # 中间件 ├── pkg/ # 可公开复用的库（可被其他项目 import） │ └── utils/ # 通用工具（如字符串处理、时间格式等） ├── api/ # OpenAPI/Swagger 定义、gRPC .proto 文件 │ └── v1/ │ └── api.swagger.json ├── scripts/ # 部署、数据库迁移等脚本 │ └── migrate.sh ├── test/ # 端到端测试、集成测试（非 *_test.go） │ └── e2e_test.go ├── deployments/ # Dockerfile、K8s 配置等 │ ├── Dockerfile │ └── k8s/ └── docs/ # 项目文档最小可行结构（小型项目）my-simple-app/ ├── go.mod ├── main.go # 包含 handler + 业务逻辑（仅限 demo） ├── handler/ │ └── user.go └── README.md
在Linux平台上，golang的安装分为两步：压文件后放置/usr/local/go在$HOME/.profile或者/etc/profile中添加环境变量export PATH=$PATH:/usr/local/go/bin但是如果使用非root用户登录，通过sudo切换成root，或者直接使用sudo go，会出现go: command not found的提示。原因也很直接，sudo有自己的环境变量，叫做secure_path，不使用常见的profile。以下给出sudo也可以使用go的方法，即给sudo添加环境变量：添加方法第一步打开sudo的配置文件sudo visudo寻找到Defaults secure_path =这一行，一般就在最开始的部分最后，在上句名为添加:/usr/local/go/bin即可。这时候建议退出系统重新登录以激活修改的配置，否则可能还是找不到。
此程序已在Github上开源，https://github.com/uselibrary/systemMonitorsystemMonitorsystemMonitor是一个基于Go语言的自托管轻量型服务器性能检测与告警软件。可以检测CPU、硬盘内存和流量的使用量，并可在超过(或恢复)设置的限制后，通过电报机器人发送通知。A Self-hosted Lightweight System Monitor by Golang效果演示安装方法需要准备的事项事先准备Telegram Bot (即电报机器人)的密钥(token)和对话ID(chat id)，教程可以参考这里：自建电报机器人/telegram bot实现消息推送需要监控的硬盘的名称，如dev/sda1。具体可使用df -h查看，如下所示，/目录对应着/dev/vda1，则此服务器的硬盘是/dev/vda1Filesystem Size Used Avail Use% Mounted on udev 2.0G 0 2.0G 0% /dev tmpfs 394M 484K 393M 1% /run /dev/vda1 39G 2.8G 34G 8% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 394M 0 394M 0% /run/user/1000阈值设置细则。配置文件为/usr/local/systemMonitor/config.json，安装过程中将自动生成，也可以随后手动修改。安装过程中会要求输入：请输入服务器名称: # 名称用于区别服务器，推送消息的时候也会使用 请输入Telegram Bot Token: # 即上述的密钥(token) 请输入Telegram Chat ID: # 即上述的对话ID(chat id) 请输入磁盘名称: # 即上述的硬盘的名称 请输入CPU使用率阈值: # 单个CPU的理论最大值是1.00，如果无负载则是0.00，一般推荐0.20 请输入磁盘使用率阈值: # 硬盘使用率，如果输入50，当硬盘使用率超过50%则会告警 请输入网络使用率阈值: # 月带宽使用率，单位为GB，如果以前没有安装过vnstat，则统计信息从安装此软件开始计算。 请输入内存使用率阈值: # 内存使用率，如果输入50，当内存使用率超过50%则会告警以下是config.json文件的示例{ "name": "demo.domain.com", "telegram": { "token": "123456789:ABCD45-VCSIDUIC78VS78RN", "chat_id": "123456789" }, "disk": "dev/sda1", "status": { "cpu": 0.2, "diskpercentage": 50, "network": 500, "memorypercentage": 50 } }此程序由crontab定时运行，每10分钟检查一次。修改检查频率，可以手动编辑/var/spool/cron/crontabs/root文件。一键安装wget --no-check-certificate -O install.sh https://raw.githubusercontent.com/uselibrary/systemMonitor/main/install.sh && chmod +x install.sh && bash install.sh如果需要卸载，则运行wget --no-check-certificate -O uninstall.sh https://raw.githubusercontent.com/uselibrary/systemMonitor/main/uninstall.sh && chmod +x uninstall.sh && bash uninstall.sh