Go程序必须有且仅有一个package main中的func main(),它是执行入口;变量声明需严格遵循:=(函数内)和var(包级或显式类型)规则;错误处理必须显式检查err != nil;切片是主力,其零值nil安全但行为不同于指针。

main 函数必须存在,且只能在 package main 中;没它,Go 程序根本跑不起来——这是你写第一行代码前就得确认的铁律。
从 go run 开始:别跳过最简可执行单元
新手常卡在“写了代码却报错”,90% 是因为包声明或函数结构不对。不是语法难,是 Go 对程序骨架有硬性要求:
-
package main必须是文件首行,不能拼错、不能缺 -
import必须显式列出所有用到的包,哪怕只用了一个fmt.Println -
func main()必须小写main,且不能带参数、不能有返回值
实操建议:先敲这个,保存为 hello.go,然后终端执行 go run hello.go —— 成功输出才是后续一切的前提:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
别急着加逻辑。如果这三行都通不过,后面学切片、goroutine 都是空中楼阁。
:= 和 var 怎么选?变量声明的隐性规则
Go 不允许声明但不使用的变量(编译直接报错),所以初学者容易因“多写一行 var x int 却没用它”而卡住。这不是 bug,是设计约束:
立即学习“go语言免费学习笔记(深入)”;
-
:=是函数内首选:自动推导类型 + 强制使用,适合局部变量,比如name := "Alice"、count, total := 10, 100 -
var用于包级变量、需显式指定类型、或明确初始化为零值的场景,比如var port int = 8080、var users []string(注意:这是nil切片,不是空切片) - 别混用:
var x = 5可以,但x := 5在函数外非法;var x, y int合法,x, y := 1, 2在函数外会报错
错误处理不是可选项,是调用函数时的必填动作
Go 没有 try/catch,error 是普通返回值,且按惯例总在最后一个位置。忽略它,程序可能静默失败——比如读文件出错但没提示,后续逻辑全崩。
- 永远优先检查
err != nil,而不是写if err == nil { ... }—— 这是 Go 社区约定俗成的防御顺序 - 常见陷阱:
ioutil.ReadFile已被弃用,现在该用os.ReadFile;errors.New适合简单字符串,复杂错误用fmt.Errorf("failed to parse %s: %w", filename, err)套娃包装 - 多返回值函数别漏接:像
splitName(full string) (first, last string),调用时必须写f, l := splitName("Li Hua"),少一个变量名就编译失败
切片不是数组,但你几乎不用数组
数组长度固定、值传递、很少直接用;切片才是日常主力。它的行为容易误解:
-
s := []int{1,2,3}创建的是切片,不是数组;a := [3]int{1,2,3}才是数组(带方括号和长度) -
append返回新切片,原切片不变;底层数组扩容后地址可能变化,所以别假设s和append(s, 4)共享同一块内存 - 切片表达式
s[i:j]的j是**排除**索引,不是长度;s[1:3]取第1、2个元素,不是取3个
真正容易被忽略的点是:切片的零值是 nil,对 nil 切片调用 len 或 cap 没问题,但 append 它是安全的,for range 它也不会 panic —— 这和 map 的 nil 行为一致,但和指针的 nil 解引用完全不同。










