leanote明确要求go 1.15或更高版本,但实际需依据其go.mod中go指令声明的最低版本选择——如写go 1.21则必须用1.21+,因泛型等特性缺失会导致go mod tidy失败;go111module=on为强制要求,且mongodb连接需匹配host解析与服务状态。

Go版本选1.20还是1.21?看项目go.mod里写的什么
Leanote明确要求Go 1.15或更高版本,但实际编译时不能只看“≥1.15”——它用的Revel框架在1.21+里已有兼容性调整,而某些老插件(比如revel/cmd/revel)在1.22之后被移除。你得先打开项目根目录下的go.mod,查go行声明的最小版本:
go 1.20
就别装1.23;如果写的是go 1.21,那1.20可能缺泛型支持导致go mod tidy失败。Mac上用brew install go@1.21再brew link go@1.21比手动切GOROOT更稳。
GO111MODULE=on不是可选项,是必须项
Leanote用Go Modules管理依赖,但很多新手在go env里看到GO111MODULE=""就以为默认开启。其实旧shell配置或IDE终端可能没加载环境变量,导致go build报no required module provides package。执行前务必确认:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
go env GO111MODULE输出必须是on - 如果为空,运行
go env -w GO111MODULE=on - VS Code里开新终端后,
go env和系统终端结果不一致?那是IDE没读取你的.zshrc,得在设置里填"go.goroot"和"go.gopath"绝对路径
go build加不加-ldflags -s -w,差别在二进制体积和调试能力
Leanote编译时常用go build -ldflags "-s -w" -o leanote .,这两个flag不是玄学参数:
-
-s:删掉符号表,strings leanote | grep "main."基本搜不到函数名,防逆向但没法用delve调试 -
-w:去掉DWARF调试信息,文件体积能减30%~50%,但pprof火焰图会丢失源码行号 - 开发阶段建议先不加,出panic时能直接看到栈帧里的文件名和行号;上线前再补上
MongoDB连接失败?先检查leanote.conf里host和port是否匹配本地服务
Leanote启动时报connection refused,90%不是代码问题,而是配置和MongoDB状态不匹配:
-
leanote.conf里db.host写localhost,但MongoDB监听的是127.0.0.1(IPv4)——macOS上localhost可能解析成IPv6地址::1,连不上 - 确认MongoDB进程在跑:
ps aux | grep mongod,没输出就mongod --dbpath /data/db手动启 - Leanote默认用
db.name = leanote,但MongoDB里还没创建这个库?没关系,首次连接会自动建,只要用户有createDatabase权限
跨平台编译时最容易漏掉的是MongoDB驱动版本和Go版本的组合兼容性——比如go.mongodb.org/mongo-driver/mongo v1.12要求Go ≥1.18,低于这版本的go build会卡在internal/unsafeheader找不到。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










