GO-输入输出函数和流程控制语句

目录

1. 流程控制语句

1.1 分支语句

1.1.1 双分支语句

1.1.2 单分支

1.1.3 多分支

 1.1.4 switch-多分支语句

1.1.5 分支嵌套

1.2 流程循环语句

1.2.1 for循环语句

1.2.2 三要素for循环

1.2.3 for循环嵌套if判断

1.2.4 退出循环

 1.2.5 循环嵌套

2. 输入输出函数

2.1 输出函数

2.2 输入函数


1. 流程控制语句

  • 程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。
  • 其流程控制方式有:
    • 顺序结构

    • 分支结构

    • 循环结构

1.1 分支语句

  • 顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。

1.1.1 双分支语句

双分支语句格式:
if 布尔表达式 {
	结果为ture指定的代码块
}else {
	结果为false执行的代码块
} 

package main

import (
	"fmt"
)

func main() {
	
	fmt.Println("请输入你的年龄")
    var age int
	fmt.Scan(&age)
	if age >= 18 {
		fmt.Println("欢迎观看")
	} else {
		fmt.Println("未成年禁止look")
	}
}

1.1.2 单分支

单分支判断语句格式:
if 布尔表达式 {
    条件为true执行的代码
}

package main

import (
	"fmt"
)

func main() {
	name := "li"
	if name == "liu" {
		fmt.Println("yes")
	}
}

1.1.3 多分支

多分支语句格式:
if 布尔表达式 {
	结果为ture指定的代码块
}else if 布尔表达式 {
	结果为true执行的代码块
}else if 布尔表达式 {
	结果为true执行的代码块
}else {
    以上所有布尔表达式条件都不满足执行此代码块
}


package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Print("输入你的成绩:")
	var score int
	fmt.Scan(&score)
	if score < 0 || score > 100 {
		fmt.Println("请输入正确的成绩")
	} else if score == 100 {
		fmt.Println("NB")
	} else if score >= 90 {
		fmt.Println("优秀")
	} else if score >= 70 {
		fmt.Println("良好")
	} else if score >= 60 {
		fmt.Println("差点挨揍")
	} else {
		fmt.Println("你是猪吗,那么笨 回家等着挨揍吧")
	}
	time.Sleep(time.Second * 2)  //时间函数 睡眠模块
}

 1.1.4 switch-多分支语句

// 语法:switch后面的变量匹配下面的case,是通过hash计算的,并不会挨个匹配
// switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的

switch var {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

/*
给出如下选项,并根据选项进行效果展示:
    输入1:则输出"普通攻击"
    输入2:则输出"超级攻击"
    输入3:则输出"使用道具"
    输入3:则输出"逃跑"
*/

var choice int
fmt.Println("请输入选择:")
fmt.Scanln(&choice)
//fmt.Println(choice,reflect.TypeOf(choice))

switch choice {
  case 1:fmt.Println("普通攻击")
	case 2:fmt.Println("超级攻击")
	case 3:fmt.Println("使用道具")
	case 4:fmt.Println("逃跑")
	default:fmt.Println("输入有误!")
}

1.1.5 分支嵌套

//if switch嵌套格式
if n == 1 {
    //根据成绩判断 成绩等级
    if cj >= 90 && <=100 {
        fmt.Println("nb")
    }
}else if n == 2  {
    switch yue {
        case 1:
        if ri <= 21 {
            fmt.Println()
        }else {
            
        }  
    }
}else {
    if username == ""  && password == "" {
        //结果为真  执行
    }else {
        //结果为假  执行
    }
} 


package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	fmt.Print("1.成绩等级\n", "2.星座判断\n", "3.用户密码\n", "执行选择:")
	var n int
	fmt.Scan(&n)
	if n >= 1 && n <= 3 {
		switch n {
		case 1:
			fmt.Print("请输出成绩:")
			var cj int
			fmt.Scan(&cj)
			if cj >= 0 && cj <= 100 {
				if cj == 100 {
					fmt.Println("NB")
				} else if cj >= 90 {
					fmt.Println("优秀")
				} else if cj >= 70 {
					fmt.Println("良好")
				} else if cj >= 60 {
					fmt.Println("差点挨揍")
				} else {
					fmt.Println("你是猪吗 这么笨")
				}
			}
		case 2:
			fmt.Print("请按照指定格式输入出生日期xxxx-xx-xx:")
			var a string
			fmt.Scan(&a)
			a1 := strings.Split(a, "-")
			yue, _ := strconv.Atoi(a1[1])
			ri, _ := strconv.Atoi(a1[2])
			if yue == 3 && ri >= 21 && ri <= 31 {
				fmt.Println("白羊座")
			} else if yue == 4 && ri <= 20 {
				fmt.Println("白羊座")
			} else if yue == 4 && ri >= 21 {
				fmt.Println("金牛座")
			} else if yue == 5 && ri <= 20 {
				fmt.Println("金牛座")
			} else if yue == 5 && ri >= 21 {
				fmt.Println("双子座")
			} else if yue == 6 && ri <= 21 {
				fmt.Println("双子座")
			} else if yue == 6 && ri >= 22 {
				fmt.Println("巨蟹座")
			} else if yue == 7 && ri <= 22 {
				fmt.Println("巨蟹座")
			} else if yue == 7 && ri >= 23 {
				fmt.Println("狮子座")
			} else if yue == 8 && ri <= 22 {
				fmt.Println("狮子座")
			} else if yue == 8 && ri >= 23 {
				fmt.Println("处女座")
			} else if yue == 9 && ri <= 22 {
				fmt.Println("处女座")
			} else if yue == 9 && ri >= 23 {
				fmt.Println("天秤座")
			} else if yue == 10 && ri <= 22 {
				fmt.Println("天秤座")
			} else if yue == 10 && ri >= 23 {
				fmt.Println("天蝎座")
			} else if yue == 11 && ri <= 21 {
				fmt.Println("天蝎座")
			} else if yue == 11 && ri >= 22 {
				fmt.Println("射手座")
			} else if yue == 12 && ri <= 21 {
				fmt.Println("射手座")
			} else if yue == 12 && ri >= 22 {
				fmt.Println("魔羯座")
			} else if yue == 1 && ri <= 19 {
				fmt.Println("魔羯座")
			} else if yue == 1 && ri >= 20 {
				fmt.Println("水瓶座")
			} else if yue == 2 && ri <= 18 {
				fmt.Println("水瓶座")
			} else if yue == 2 && ri >= 19 {
				fmt.Println("双鱼座")
			} else if yue == 3 && ri <= 20 {
				fmt.Println("双鱼座")
			} else {
				fmt.Println("去 滚")
			}
		case 3:
			fmt.Print("输入用户名 密码")
			var username, password string
			fmt.Scan(&username, &password)
			if username == "liuzhusong" && password == "123" {
				fmt.Println("输入正确")
			} else {
				fmt.Println("用户名或密码错误")
			}
		}
	}
}

1.2 流程循环语句

1.2.1 for循环语句

  • 与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构

  • for 后面的条件表达式不需要用圆括号()括起来

  • 左花括号{必须与 for 处于同一行。

  • 无限循环的场景 for true {},可以简写 for {}

	count := 0       // 初始化语句
	for count < 10 { // 条件判断
		fmt.Println("hello yuan!")
		count++ //  步进语句
	}
	fmt.Println("end")
count := 10     // 初始化语句
for count > 0 { // 条件判断
		fmt.Println(count)
		count-- //  步进语句
	}
fmt.Println("end")

 

1.2.2 三要素for循环

  • init: 初始化语句,一般为赋值表达式,给控制变量赋初值;

  • condition:条件判断,一般是关系表达式或逻辑表达式,循环控制条件;

post: 步进语句,一般为赋值表达式,给控制变量增量或减量。

for i := 1; i < 10; i++ {
		fmt.Println(i)
	}


执行:

> (1)初始语句
>
> (2)条件判断,布尔值为真则执行一次循环体,为假则退出循环
>
> (3)执行一次循环体语句结束后,再执行步进语句,然后回到步骤(2),依次循环

1.2.3 for循环嵌套if判断

package main

import (
	"fmt"
)

func main() {
	fmt.Println(`
1.平A
2.技能1
3.技能2
4.大招
		`)
	for true {
		fmt.Print("输入使用攻击方式:")
		var sc int
		fmt.Scan(&sc)
		if sc >= 1 && sc <= 4 {
			switch sc {
			case 1:
				fmt.Println("平A")
			case 2:
				fmt.Println("技能1")
			case 3:
				fmt.Println("技能2")
			case 4:
				fmt.Println("大招")
			}

		} else {
			fmt.Println("看好攻击序号输入")

		}
	}
}

1.2.4 退出循环

  • 如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字。

  • break 用来跳出整个循环语句,也就是跳出所有的循环次数;

  • continue 用来跳出当次循环,也就是跳过当前的一次循环。

break

// 当 break 关键字用于 for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足某个条件时便跳出循环,继续执行循环语句下面的代码。

for i := 0; i < 10; i++ {
		if i==8{
			break
		}
		fmt.Println(":",i)
}

continue

// break 语句使得循环语句还没有完全执行完就提前结束,与之相反,continue 语句并不终止当前的循环语句的执行,仅仅是终止当前循环变量 i 所控制的这一次循环,而继续执行该循环语句。continue 语句的实际含义是“忽略 continue 之后的所有循环体语句,回到循环的顶部并开始下一次循环”

for i := 0; i < 10; i++ {
		if i==8{
			continue
		}
		fmt.Println(":",i)
	}

 1.2.5 循环嵌套

// 独立嵌套

for i := 0; i < 5; i++ {
    
    for j:=0;j<5;j++ {
        fmt.Print("*")
    }
    fmt.Print("\n")
}

// 关联嵌套

package main

import "fmt"

func main() {
	// 遍历, 决定处理第几行
	for y := 1; y <= 9; y++ {
		// 遍历, 决定这一行有多少列
		for x := 1; x <= y; x++ {
			fmt.Printf("%d*%d=%d ", x, y, x*y)
		}
		// 手动生成回车
		fmt.Println()
	}
}

2. 输入输出函数

2.1 输出函数

// 使用fmt包下的println或print等
package main

import (
	"fmt"
	"reflect"
	"strings"
)

func main() {
	var (
		name = "liuzhusong"
		age  = 22
		xb   = true
	)

	fmt.Print(name, age) //print不换行打印输出
	
    fmt.Println(name, age) //打印输出并换行

	fmt.Println("姓名:", name, "年龄:", age) //打印多个值得时候用逗号分割

	fmt.Printf("姓名: %s 年龄: %d 性别: %t \n", name, age, xb) //printf格式化输出不自动换行 %s占位符代表字符串类型 %d占位符代表整数 %t占位符代表布尔类型,在将对应得变量名按照格式得顺序进行排列输出。

	fmt.Sprintf("姓名: %s 年龄: %d 性别: %t \n", name, age, xb) //不向终端打印格式化输出。
	
    s := fmt.Sprintf("姓名: %s 年龄: %d 性别: %t", name, age, xb)//格式化输出 赋值在变量中
	fmt.Println(s)

}

2.2 输入函数

package main

import (
	"fmt"
)

func main() {
	//输入函数 Scan  的特点为 括号内有多少个输入的赋值的变量,就必须要输入多少个值,否则一直停留在IO堵塞状态
	fmt.Print("输入你的名字")
	var name string //创建一个字符串变量,赋值为空
	fmt.Scan(&name) //Fmt.Scan函数为输入函数,向程序内部发送指令,&为占位符,&name才可以修改外部name得值
	fmt.Println(name, reflect.TypeOf(name))

	//用户登录
	fmt.Print("请输入姓名 年龄")
	var name5 string
	var age2 int
	fmt.Scan(&name5, &age2)
	fmt.Println(name5, age2)

	fmt.Println("输入出生日期xxxx-xx-xx")
	var year string
	fmt.Scan(&year)
	year2 := strings.Split(year, "-")
	fmt.Printf("%s年%s月%s日 \n", year2[0], year2[1], year2[2])

	//Scanln 输入特点  不管在Scanln中有多少个被赋值的变量,只要回车就停止赋值,直接运行程序。
	fmt.Print("请输入姓名 年龄")
	var name6 string
	var age3 int
	fmt.Scanln(&name6, &age3)
	fmt.Println(name5, age2)

	//Scanf 输入特点  按照指定格式输入
	var x1 int
	var x2 int
	fmt.Print("请按照 x + x 的格式输入")
	fmt.Scanf("%d + %d", &x1, &x2)
	fmt.Println(x1 + x2)
    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下 目录 1. 入门 1 1.1. Hello world 1 1.2. 命令行参数 2 2. 程序结构 3 2.1. 类型 4 2.1.1. 命名类型(named type)与未命名类型(unamed type) 4 2.1.2. 基础类型(underlying type) 4 2.1.3. 可赋值性 5 2.1.4. 类型方法集 6 2.1.5. 类型声明 6 2.2. 变量 8 2.2.1. 变量声明 8 2.2.2. 类型零值 12 2.2.3. 指针 13 2.3. 赋值 17 2.4. 包和文件 17 2.5. 作用域 18 2.6. 语句 19 2.7. 比较运算符 20 2.8. 类型转换 21 2.9. 控制流 23 2.9.1. If 23 2.9.2. Goto 24 2.9.3. For 25 2.9.4. Switch 25 2.9.5. break语句 31 2.9.6. Continue语句 31 3. 基础数据类型 31 3.1. golang类型 31 3.2. Numeric types 32 3.3. 字符串 33 3.3.1. 什么是字符串 33 3.3.2. 字符串底层概念 35 3.3.3. 获取每个字节 38 3.3.4. Rune 39 3.3.5. 字符串的 for range 循环 40 3.3.6. 用字节切片构造字符串 41 3.3.7. 用rune切片构造字符串 42 3.3.8. 字符串的长度 42 3.3.9. 字符串是不可变的 42 3.3.10. UTF8(go圣经) 43 3.4. 常量 45 3.4.1. 常量定义 45 3.4.2. 常量类型 46 3.4.3. Iota 46 4. 组合数据类型 47 4.1. 数组 47 4.1.1. 数组概述 47 4.1.2. 数组的声明 49 4.1.3. 数组的长度 50 4.1.4. 遍历数组 50 4.1.5. 多维数组 51 4.2. 切片 52 4.2.1. 什么是切片 52 4.2.2. 切片概述 55 4.2.3. 创建一个切片 55 4.2.4. 切片遍历 57 4.2.5. 切片的修改 58 4.2.6. 切片的长度和容量 60 4.2.7. 追加切片元素 62 4.2.8. 切片的函数传递 65 4.2.9. 多维切片 66 4.2.10. 内存优化 67 4.2.11. nil slice和empty slice 69 4.2.12. For range 70 4.3. 结构 71 4.3.1. 什么是结构体? 71 4.3.2. 结构体声明 73 4.3.3. 结构体初始化 77 4.3.4. 嵌套结构体(Nested Structs) 81 4.3.5. 匿名字段 82 4.3.6. 导出结构体和字段 84 4.3.7. 结构体相等性(Structs Equality) 85 4.4. 指针类型 86 4.5. 函数 87 4.6. map 87 4.6.1. 什么是map 87 4.6.2. 声明、初始化和make 89 4.6.3. 给 map 添加元素 91 4.6.4. 获取 map 中的元素 91 4.6.5. 删除 map 中的元素 92 4.6.6. 获取 map 的长度 92 4.6.7. Map 的相等性 92 4.6.8. map的排序 92 4.7. 接口 93 4.7.1. 什么是接口? 93 4.7.2. 接口的声明与实现 96 4.7.3. 接口的实际用途 97 4.7.4. 接口的内部表示 99 4.7.5. 空接口 102 4.7.6. 类型断言 105 4.7.7. 类型选择(Type Switch) 109 4.7.8. 实现接口:指针接受者与值接受者 112 4.7.9. 实现多个接口 114 4.7.10. 接口的嵌套 116 4.7.11. 接口的零值 119 4.8. Channel 120 4.9. 类型转换 120 5. 函数 120 5.1. 函数的声明 121 5.2. 一个递归函数的例子( recursive functions) 121 5.3. 多返回值 121 5.4. 命名返回值 121 5.5. 可变函数参数 122 5.6. Defer 123 5.6.1. Defer语句介绍 123 5.6.2. Defer使用场景 128 5.7. 什么是头等(第一类)函数? 130 5.8. 匿名函数 130 5.9. 用户自定义的函数类型 132 5.10. 高阶函数(装饰器?) 133 5.10.1. 把函数作为参数,传递给其它函数 134 5.10.2. 在其它函数中返回函数 134 5.11. 闭包 135 5.12. 头等函数的实际用途 137 6. 微服务创建 140 6.1. 使用net/http创建简单的web server 140 6.2. 读写JSON 144 6.2.1. Marshal go结构到JSON 144 6.2.2. Unmarshalling JSON 到Go结构 146 7. 方法 146 7.1. 什么是方法? 146 7.2. 方法示例 146 7.3. 函数和方法区别 148 7.4. 指针接收器与值接收器 153 7.5. 那么什么时候使用指针接收器,什么时候使用值接收器? 155 7.6. 匿名字段的方法 156 7.7. 在方法中使用值接收器 与 在函数中使用值参数 157 7.8. 在方法中使用指针接收器 与 在函数中使用指针参数 159 7.9. 在非结构体上的方法 161 8. 并发入门 162 8.1. 并发是什么? 162 8.2. 并行是什么? 162 8.3. 从技术上看并发和并行 163 8.4. Go 对并发的支持 164 9. Go 协程 164 9.1. Go 协程是什么? 164 9.2. Go 协程相比于线程的优势 164 9.3. 如何启动一个 Go 协程? 165 9.4. 启动多个 Go 协程 167 10. 信道channel 169 10.1. 什么是信道? 169 10.2. 信道的声明 169 10.3. 通过信道进行发送和接收 169 10.4. 发送与接收默认是阻塞的 170 10.5. 信道的代码示例 170 10.6. 信道的另一个示例 173 10.7. 死锁 174 10.8. 单向信道 175 10.9. 关闭信道和使用 for range 遍历信道 176 11. 缓冲信道和工作池(Buffered Channels and Worker Pools) 179 11.1. 什么是缓冲信道? 179 11.2. 死锁 182 11.3. 长度 vs 容量 183 11.4. WaitGroup 184 11.5. 工作池的实现 186 12. Select 188 12.1. 什么是 select? 188 12.2. 示例 189 12.3. select 的应用 190 12.4. 默认情况 190 12.5. 死锁与默认情况 191 12.6. 随机选取 191 12.7. 这下我懂了:空 select 191 13. 文件读写 191 13.1. GoLang几种读文件方式的比较 197 14. 个人 197 14.1. ++,-- 198 14.2. 逗号 198 14.3. 未使用的变量 199 14.4. Effective go 199 14.4.1. 指针 vs. 值 199 14.5. 可寻址性-map和slice的区别 201 14.5.1. slice 201 14.5.2. map 202 14.6. golang库 203 14.6.1. unicode/utf8包 203 14.6.2. time包 205 14.6.3. Strings包 205 14.6.4. 输入输出 212 14.6.5. 正则处理 224 14.6.6. Golang内建函数 226

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值