Go学习笔记:函数与控制流——多返回值、for 与 if 的独特语法

发布时间:2026/8/21 6:30:25
Go学习笔记:函数与控制流——多返回值、for 与 if 的独特语法 本文首发于 栏轩·阁欢迎访问阅读原文获取更好的阅读体验。一、函数1.1 基本语法Go 的声明和 C/Java 最大的区别是类型写在变量名后面。// C/Java: int add(int a, int b)// Go: func add(a int, b int) intfuncadd(aint,bint)int{returnab}当连续参数类型相同时可以省略前面的类型funcadd(a,bint)int{// a 和 b 都是 intreturnab}1.2 多返回值Go 的特色Go 没有异常try-catch错误通过返回值传递funcdiv(a,bint)(int,error){ifb0{return0,errors.New(除数不能为 0)}returna/b,nil// nil 表示没有错误}调用时必须接收所有返回值result,err:div(10,3)iferr!nil{fmt.Println(出错:,err)}else{fmt.Println(result)// 3}// 用 _ 忽略不需要的返回值single,_:div(9,2)// 只想要商忽略余数/错误nil是 Go 的空值类似其他语言的null。error为 nil 表示没有错误。1.3 命名返回值可以在函数签名里就给返回值起好名字函数体里直接赋值最后return即可funcsumAndCount(nums...int)(totalint,countint){for_,n:rangenums{totaln// total 已经声明好了count// count 也声明好了}return// 自动返回 total 和 count}什么时候用命名返回值返回值含义需要明确命名来说明时简单函数可以少写一些变量声明不要滥用——函数太复杂时命名返回值反而降低可读性1.4 可变参数funcsum(nums...int)int{// ...int 表示可变参数total:0for_,n:rangenums{totaln}returntotal}sum(1,2)// 3sum(1,2,3,4,5)// 15二、控制流2.1 for — Go 唯一的循环Go只有for没有while和do-while。经典三段式fori:0;i5;i{fmt.Println(i)// 0, 1, 2, 3, 4}替代 whilen:0forn3{// 只写条件省略前后fmt.Println(n)n}死循环for{// 一直执行直到 breakif条件{break}}for range 遍历names:[]string{Go,Python,Rust}// 同时取 index 和 valuefori,lang:rangenames{fmt.Printf(%d: %s\n,i,lang)}// 只要 value不要 indexfor_,lang:rangenames{fmt.Println(lang)}// 只要 indexfori:rangenames{fmt.Println(i)}2.2 if — 条件不需要括号age:20ifage18{fmt.Println(已成年)}else{fmt.Println(未成年)}⚠️ 条件不能加括号——加括号反而让 Go 觉得别扭这是和其他语言最大的视觉差异。if 的独特用法先执行一个短语句再判断ifscore:85;score60{fmt.Println(及格得分:,score)}else{fmt.Println(不及格得分:,score)}// 这里用不了 score它只活在 if/else 里这种写法的好处把「获取值」和「判断」写在一起变量作用域限制在 if 块内防止误用。2.3 switchday:3switchday{case1:fmt.Println(周一)case2:fmt.Println(周二)case3:fmt.Println(周三)default:fmt.Println(其他)}Go 的 switch 和 C 不同每个 case 自动 break不需要写break。如果想继续执行下一个 case可以用fallthrough很少用。三、完整示例把今天学的串起来packagemainimport(errorsfmt)// 检查分数是否及格funccheckScore(namestring,scoreint)(string,error){ifscore0||score100{return,errors.New(分数必须在 0-100 之间)}result:不及格ifscore60{result及格}returnfmt.Sprintf(%s: %s,name,result),nil}funcmain(){students:[]int{85,42,93,-5}fori,score:rangestudents{names:[]string{张三,李四,王五,赵六}ifresult,err:checkScore(names[i],score);err!nil{fmt.Printf(❌ %s 数据异常: %s\n,names[i],err)}else{fmt.Printf(✅ %s\n,result)}}}输出✅ 张三: 及格 ✅ 李四: 不及格 ✅ 王五: 及格 ❌ 赵六 数据异常: 分数必须在 0-100 之间四、小结知识点要点函数参数类型写在变量名后面多返回值(int, error)— 不用异常传递错误命名返回值提前声明直接 return可变参数nums ...intfor唯一循环三段式 / 类 while / 死循环 / rangeif不用括号支持短语句switch默认自动 break