Go语言第三章(五谷轮回)

发布时间:2026/7/27 5:15:06

Go语言第三章(五谷轮回) 北冥神功(太玄经)packagemainimportfmttypePersonstruct{NamestringAgeintSexstring}funcmain(){person:Person{Name:张三,Age:18,Sex:男,}ifperson.Age18{fmt.Println(成年)}else{fmt.Println(未成年)}}我们定义了一个Person结构体包含Name、Age、Sex三个字段。然后创建了一个实例判断其年龄是否满 18 岁满 18 岁输出「成年」否则输出「未成年」。这就是最基本的if/else二选一判断。多条件判断packagemainimportfmttypePersonstruct{Statusstring}funcmain(){person:Person{Status:在线,}ifperson.Status在线{fmt.Println(在线)}elseifperson.Status离线{fmt.Println(离线)}elseifperson.Status忙碌{fmt.Println(忙碌)}else{fmt.Println(未知状态)}}当需要处理三种及以上的分支时可以在if后面连续使用else if从上到下依次判断命中第一个为真的分支后就不再往下执行。最后的else用于兜底处理所有未匹配的情况。上面示例模拟了用户在线状态Status为「在线」「离线」「忙碌」时分别输出对应文字其他值则输出「未知状态」。同样的逻辑用switch写会更简洁——把要判断的值写在switch后面每个case对应一种取值packagemainimportfmttypePersonstruct{Statusstring}funcmain(){person:Person{Status:在线,}switchperson.Status{case在线:fmt.Println(在线)case离线:fmt.Println(离线)case忙碌:fmt.Println(忙碌)default:fmt.Println(未知状态)}}switch会拿person.Status与每个case逐一比较匹配到就执行对应分支。Go 的switch默认不会穿透到下一个case不需要写break。所有case都不匹配时执行default分支。写法适用场景if/else if条件各不相同不好抽成一个表达式switch 表达式同一个值匹配多种固定取值如状态、等级、星期逻辑嵌套packagemainimportfmttypePersonstruct{NamestringAgeintSexstring}funcmain(){person:Person{Name:张三,Age:18,Sex:男,}ifperson.Age18{ifperson.Sex男{fmt.Println(成年男性)}else{fmt.Println(成年女性)}}else{fmt.Println(未成年)ifperson.Sex男{fmt.Println(未成年男性)}else{fmt.Println(未成年女性)}}}多个if条件判断可以嵌套使用我们首先判断年龄是否等于18如果等于18则再判断性别是否等于男如果等于男则输出成年男性否则输出成年女性。如果不等于18则输出未成年再判断性别是否等于男如果等于男则输出未成年男性否则输出未成年女性。这就是一个基本的逻辑嵌套。当然也不是只能嵌套两层可以嵌套多层但是要注意逻辑的正确性。逻辑运算符判断条件经常需要组合多个表达式常用的逻辑运算符如下运算符含义示例为真条件并且a ba、b都为真||或者a || ba、b至少一个为真!取反!aa为假并且age:18sex:男ifage18sex男{fmt.Println(成年男性)}表示并且左右两边条件都为真整个表达式才为真。上面只有「年满 18 岁」且「性别为男」时才会打印「成年男性」。或者||age:33ifage18||age19{fmt.Println(18 岁或 19 岁)}else{fmt.Println(其他年龄)}||表示或者左右两边只要有一个为真整个表达式就为真。上面当年龄是 18或19 时走if分支否则走else。取反!isLogin:falseif!isLogin{fmt.Println(请先登录)}!把布尔值反过来!true为false!false为true。常用于「不满足某条件时」的分支判断。作业基础判断声明一个int类型的分数变量用if/else if/else判断等级90 分及以上为「优秀」6089 为「及格」60 分以下为「不及格」并打印结果。switch 练习定义一个string变量表示星期几如周一用switch匹配并打印对应提示未匹配时走default输出「无效的星期」。状态判断参照文中的Person结构体将Status分别设为「在线」「离线」「忙碌」和一个自定义值分别运行if/else if和switch两个版本观察输出是否一致。逻辑运算符声明age和hasTicket两个变量用判断「年满 18 岁且已购票」方可入场再改用||判断「会员或年龄大于 60 岁」可享受优惠分别打印结果。综合练习定义包含Name、Age、Score的结构体结合if嵌套判断年满 18 且分数不低于 60 才输出「合格」否则输出「不合格」并带上姓名。五谷轮回Go 里只有一种循环关键字for。没有while、也没有do-while所有循环形态都靠for表达。普通 for 循环我们声明了一个切片用经典的「初始化条件步进」写法遍历packagemainimportfmtfuncmain(){varhobbys[]string{吃饭,睡觉,打豆豆}fori:0;ilen(hobbys);i{fmt.Println(hobbys[i])}}for后面分成三段用分号隔开部分作用上面示例初始化循环开始前执行一次i : 0条件每次循环前判断为真才继续i len(hobbys)步进每次循环体结束后执行i输出依次为吃饭、睡觉、打豆豆。三段都可以省略。只留条件时就相当于其他语言里的whilepackagemainimportfmtfuncmain(){i:0fori3{fmt.Println(i)i}}条件也省略时就是无限循环需要靠break自己跳出packagemainimportfmtfuncmain(){i:0for{fmt.Println(i)iifi3{break}}}range 循环遍历切片、数组、字符串、map、channel 时更常用range写法更简洁packagemainimportfmtfuncmain(){varhobbys[]string{吃饭,睡觉,打豆豆}forindex,hobby:rangehobbys{fmt.Println(index,hobby)}}range每次迭代会返回两个值第一个是下标或 map 的 key第二个是对应的元素值输出为0 吃饭 1 睡觉 2 打豆豆如果只要值、不要下标用_丢掉第一个返回值for_,hobby:rangehobbys{fmt.Println(hobby)}如果只要下标、不要值写一个变量即可forindex:rangehobbys{fmt.Println(index)}遍历 mappackagemainimportfmtfuncmain(){person:map[string]string{name:张三,city:杭州,}forkey,value:rangeperson{fmt.Println(key,value)}}注意map 的遍历顺序不固定每次运行打印顺序可能不同。遍历字符串packagemainimportfmtfuncmain(){text:你好Goforindex,char:rangetext{fmt.Printf(下标 %d字符 %c\n,index,char)}}用range遍历字符串时拿到的是Unicode 码点rune不是单个字节。像「你」「好」这种汉字各占 3 个字节下标会按字节位置跳着走。写法适用场景for i : 0; i len(x); i需要精确控制下标、步长或从中间开始/倒序遍历for i, v : range x顺序遍历切片、数组、字符串、mapbreak 与 continue循环中经常要「提前结束」或「跳过本次」关键字含义break立刻跳出当前循环continue跳过本次剩余代码进入下一次循环break跳出循环packagemainimportfmtfuncmain(){hobbys:[]string{吃饭,睡觉,打豆豆}for_,hobby:rangehobbys{ifhobby睡觉{break}fmt.Println(hobby)}}遇到「睡觉」就break后面的元素不再遍历。输出只有吃饭。continue跳过本次packagemainimportfmtfuncmain(){hobbys:[]string{吃饭,睡觉,打豆豆}for_,hobby:rangehobbys{ifhobby睡觉{continue}fmt.Println(hobby)}}遇到「睡觉」就continue跳过打印但循环继续。输出为吃饭、打豆豆。带标签的 break多层循环嵌套时普通break只跳出最内层。若要一次跳出外层可以给循环加标签packagemainimportfmtfuncmain(){Outer:fori:0;i3;i{forj:0;j3;j{ifi1j1{breakOuter}fmt.Println(i,j)}}}break Outer会直接跳出名为Outer的那一层循环。continue也可以配合标签使用表示跳到指定循环的下一次迭代。gotogoto可以跳转到同一函数内的某个标签位置。能用但可读性往往更差日常代码里更推荐break/continue/return。packagemainimportfmtfuncmain(){i:0Loop:fmt.Println(i)iifi3{gotoLoop}}上面用goto模拟了一个简单循环打印0、1、2。实际项目中除非处理错误清理这类特殊场景否则尽量少用。作业普通 for声明一个1到10的循环打印所有偶数。range 练习定义切片[]string{春, 夏, 秋, 冬}分别用「只要下标」「只要值」「下标值」三种range写法打印。break / continue遍历1到20遇到能被3整除的数就continue跳过一旦遇到大于15的数就break结束。观察最终打印了哪些数。类 while用「只写条件」的for不要初始化段和步进段计算1 2 ... 100的和并打印。综合练习定义map[string]int表示各科分数如语文、数学、英语用range遍历低于 60 的科目打印「不及格」其余打印「及格」并统计及格科目数量。

相关新闻