判断语句if标准if语句输入年龄程序根据年龄判断状态未出生age 0儿童age 18成年人age 30中年人age 50老年人age 50packagemainimportfmtfuncmain(){varageintfmt.Println(请输入年龄: )fmt.Scan(age)ifage0{fmt.Println(未出生)}elseifage18{fmt.Println(未成年)}elseifage30{fmt.Println(成年人)}elseifage50{fmt.Println(中年人)}else{fmt.Println(老年人)}}与C语言中if主要区别不需要括号条件表达式不需要用()括起来但加了也不会报错花括号必须即使只有一行代码花括号也不能省略位置固定else必须与if的右花括号在同一行Go中if的简短语句这也是go语言中的一个特色用好了会让代码更加简洁和安全。基本语法if初始化语句;条件表达式{// 代码块}举个例子传统写法如下value:getValue()// 变量在整个函数作用域ifvaluethreshold{// 使用value}// value在这里仍然可访问简短语句写法Go特色ifvalue:getValue();valuethreshold{// 变量只在if作用域fmt.Println(超过阈值:,value)}// value在这里不可访问主要用途错误处理最常见// 读取文件ifdata,err:ioutil.ReadFile(test.txt);err!nil{fmt.Println(读取失败:,err)}else{fmt.Println(文件内容:,string(data))}// err, data 在这里都不可用// 对比传统写法data,err:ioutil.ReadFile(test.txt)// err污染了作用域iferr!nil{fmt.Println(读取失败:,err)}// err 在这里仍然可见映射检查m:map[string]int{a:1,b:2}ifvalue,exists:m[c];exists{fmt.Println(找到:,value)}else{fmt.Println(键不存在)}// value, exists 作用域仅限于if-else限制变量作用域// 情况1临时变量只在条件块中使用iftemp:calculateTemp();temp100{fmt.Println(温度过高:,temp)}elseiftemp0{fmt.Println(温度过低:,temp)}// temp 自动释放不污染外层作用域// 情况2多个临时变量ifx,y:getCoordinates();x0y0{fmt.Printf(第一象限: (%d, %d)\n,x,y)}结合deferiff,err:os.Open(file.txt);err!nil{fmt.Println(打开失败:,err)}else{deferf.Close()// 确保文件关闭// 处理文件data:make([]byte,100)f.Read(data)}// f 自动超出作用域不会忘记关闭链式操作// 连续检查多个条件ifconn,err:net.Dial(tcp,server:80);err!nil{fmt.Println(连接失败:,err)}elseifreader:bufio.NewReader(conn);reader!nil{deferconn.Close()// 使用readerdata,_:reader.ReadString(\n)fmt.Println(data)}分支语句switch基本形式:vardaystringfmt.Scan(day)switchday{case1:fmt.Println(周一)case2:fmt.Println(周二)case3:fmt.Println(周三)case4:fmt.Println(周四)case5:fmt.Println(周五)case6,7:fmt.Println(周末)default:fmt.Println(输入错误)}跟其他语言不同的是go语言中每个case执行后不会自动往下执行所以无需break如果想让它往下执行也有办法在case控制块最后加上fallthroughvardaystringfmt.Scan(day)switchday{case1:fmt.Println(周一)fallthroughcase2:fmt.Println(周二)case3:fmt.Println(周三)case4:fmt.Println(周四)case5:fmt.Println(周五)case6,7:fmt.Println(周末)default:fmt.Println(输入错误)}go中的switch也支持简短语句基本形式switch初始化语句;表达式{case值1:// ...case值2:// ...default:// ...}三种使用方式有表达式和简短语句// 最常见的形式先初始化再基于值判断switchseason:getSeason();season{casespring:fmt.Println(春天: 播种)casesummer:fmt.Println(夏天: 生长)caseautumn:fmt.Println(秋天: 收获)casewinter:fmt.Println(冬天: 休眠)default:fmt.Println(未知季节)}有简短语句但无表达式// 相当于if-else链但更清晰switchgrade:getGrade();{casegrade90:fmt.Println(A)casegrade80:fmt.Println(B)casegrade70:fmt.Println(C)casegrade60:fmt.Println(D)default:fmt.Println(F)}类型switch 简短语句switchv:getValue();v.(type){caseint:fmt.Printf(整数: %d\n,v)casestring:fmt.Printf(字符串: %s\n,v)casebool:fmt.Printf(布尔值: %v\n,v)default:fmt.Printf(未知类型: %T\n,v)}使用场景错误分类处理funcprocessRequest()error{// 模拟一个可能返回多种错误的情况returnnet.OpError{Op:read,Err:syscall.ECONNREFUSED}}funchandleError(){switcherr:processRequest();err.(type){case*net.DNSError:fmt.Println(DNS错误:,err)case*net.OpError:fmt.Println(网络操作错误:,err)casenil:fmt.Println(成功)default:fmt.Println(未知错误:,err)}}命令行参数解析funcprocessArgs(){switchflag:parseFlag();flag{case-h,--help:showHelp()case-v,--version:showVersion()case-c,--config:loadConfig()default:ifstrings.HasPrefix(flag,-){fmt.Printf(未知选项: %s\n,flag)}else{processFile(flag)}}}循环语句forGo语言中循环只有for一个关键字标准写法数字0从1加到100packagemainimportfmtfuncmain(){sum:0fori:1;i101;i{sumi}fmt.Println(sum)//5050}注意Go语言中是没有前置的说法的所以只能使用i不能使用 i具体原因如下Go 的设计团队认为副作用最小化将自增操作嵌入复杂的表达式如arr[i] j是许多 Bug 的来源降低了可读性。单一职责在 Go 中不是表达式Expression而是语句Statement。这意味着它不能返回值不能参与运算只能独立成行。消除冗余既然不返回值那么i和i的行为就变得完全一样都是给 i 加 1。保留两种写法只会增加语言的复杂性没有任何收益。Go 没有while关键字而是通过省略分号来实现count:3forcount0{fmt.Println(count)count--}// 输出顺序: 3,2,1,0死循环for{//执行任务}强大的range迭代器之王这是 Go 循环中最亮眼的部分相当于其他高级语言的范围 for 循环Range-based for loop但更强大且安全。nums:[]int{10,20,30}// 切片 (类似 vectorint)// 获取索引和值forindex,value:rangenums{fmt.Printf(Index: %d, Value: %d\n,index,value)}//Index: 0, Value: 10//Index: 1, Value: 20//Index: 2, Value: 30ages:map[string]int{Alice:25,Bob:30}forkey,val:rangeages{fmt.Printf(%s is %d years old.\n,key,val)}//Bob is 30 years old.//Alice is 25 years old.流程控制Go 利用Label可以直接跳出任意层嵌套outerLoop:// 定义标签fori:0;i3;i{forj:0;j3;j{ifi1j1{breakouterLoop// 直接跳出两层循环}fmt.Printf((%d,%d) ,i,j)}}// 输出: (0,0) (0,1) (0,2) (1,0)continue同样支持标签用于跳过外层循环的当前迭代。关于 gotoGo保留了goto但限制极严不能跨函数跳转也不能跳过变量声明。通常仅在深层嵌套错误处理中使用日常开发极少用到。流程控制Go 利用Label可以直接跳出任意层嵌套outerLoop:// 定义标签fori:0;i3;i{forj:0;j3;j{ifi1j1{breakouterLoop// 直接跳出两层循环}fmt.Printf((%d,%d) ,i,j)}}// 输出: (0,0) (0,1) (0,2) (1,0)continue同样支持标签用于跳过外层循环的当前迭代。关于 gotoGo保留了goto但限制极严不能跨函数跳转也不能跳过变量声明。通常仅在深层嵌套错误处理中使用日常开发极少用到。