流程控制
一、分支
(1)if单分支
func main() {
var name string = "11"
num, _ := strconv.ParseInt(name, 10, 8)
if num == 11 {
fmt.Println(model.Name)
}
// ***** go中用于判断字符串是否为空的方法 *****
name = ""
if len(name) != 0 {
fmt.Println("空字符产")
}
}
(2)if多分支
func main() {
// 双分支
if len(name) != 0 {
fmt.Println("空字符产")
} else {
fmt.Println("非空字符产")
}
// 多分支
name = "李四"
if name == "zhangsan" {
fmt.Println(1)
} else if name == "wangwu" {
fmt.Println(2)
} else {
fmt.Println(3)
}
}
(3)switch
需要注意,case中的值类型,必须和switch中值类型一致
- 单值匹配
func mian(){
name := "张三"
switch name {
case "zhangsan":
fmt.Println(1)
case "wangwu":
fmt.Println(2)
case "李四", "赵六": // case中可以写多个值匹配
fmt.Println(3)
default:
fmt.Println("no case")
}
}
- 范围匹配
依据name的长度进行匹配!
func main(){
name := "张三"
switch {
case len(name) < 2:
fmt.Println("长度小于2")
case len(name) > 2:
fmt.Println("长度大于2")
default:
fmt.Println("长度:2")
}
}
- swith匹配值类型
func main(){
var x interface{}
var y = 10.0
x = y
switch x.(type) {
case int:
fmt.Println("int")
case float64:
fmt.Println("float64")
default:
fmt.Println("default")
}
}
二、for循环
golang中只有for循环一种方式
(1)方式1:for i := 0; i < 10; i++{}
for i := 0; i < ; i++ {
// 99乘法表
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Print(j,"*",i,"=",i*j, "\t")
}
fmt.Println()
}
(2)方式2:for i < 10 {}
// 指定变量i
i := 1
// for 条件判断 { i循环一次递增一次 }
for i < 10 {
fmt.Println(i)
i++
}
// 循环体内break
for {
fmt.Println("测试")
i++
if i == 20 {
break
}
}
(3)方式3:for index, val := range str {}
遍历汉字用range
(按照字符方式遍历),不会出现乱码
str := "hello world你好世界"
for index, val := range str {
fmt.Printf("%d:%c\t",index,val)
}
// 输出:(由于汉字再utf-8编码中占三个字节,所以后年汉字三个index跳)
// 0:h 1:e 2:l 3:l 4:o 5: 6:w 7:o 8:r 9:l 10:d 11:你 14:好 17:世 20:界
需要注意:
方式2遍历字符串是按照字节遍历
str := "hello world你好世界" for i := 0; i < len(str); i++ { fmt.Printf("%c\t", str[i]) }
这种遍历按字节遍历,所以后续输出是乱码
输出格式如下:h e l l o w o r l d ä ½ å ¥ ½ ä ¸ç
(4)循环案例
- 九九乘法表
// 99乘法表
func FuncForOne() {
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Print(j,"*",i,"=",i*j, "\t")
}
fmt.Println()
}
}
- 三角形
func FuncJZT(n int){
for i := 1; i <= n; i++ {
// 空格
for k := 0; k < n-i; k++ {
fmt.Print(" ")
}
// 打印 *
for j := 1; j <= 2*i-1 ; j++ {
// 空心三角
if n != 1 && n!=i {
if j == 1 || j == 2*i-1{
fmt.Print("*")
} else {
fmt.Print(" ")
}
} else {
fmt.Print("*")
}
}
fmt.Println()
}
}
// 输出:
*
* *
* *
* *
* *
* *
* *
* *
* *
*******************
- 水仙花数
func FuncSXH(n int64){
var sx int64= 0
str_n := strconv.Itoa(int(n))
for i := 0; i < len(str_n); i++ {
v, _ := strconv.ParseInt(string(str_n[i]), 10, 8)
sx += v * v * v
}
if sx == n {
fmt.Println("是水仙花数")
} else {
fmt.Println("不是水仙花数")
}
}
二、跳转
(1)break 跳出当前循环
- 随机生成1-100的随机数 到79弹出
func FunSJ() { for { // 需要seed一个种子,否则每次出现的随机数都是一样的 rand.Seed(time.Now().UnixNano()) rand := rand.Intn(100) fmt.Println(rand) if rand == 79 { break } } }
- 附:随机数演示
每次输出都是一样的结果for { rand := rand.Intn(100) }
需要一个随机种子数字seed
,seed(参数)
参数给定一个数,只要数字不通则随机输出的数字也不同!事例参照如上
(2)continue 跳出本次循环
说明:只跳出本次循环
func FunCon() {
for i := 0; i < 10; i++ {
// 不输出2
if i == 2 {
continue
}
fmt.Print(" ",i)
}
}
// 输出=》
// 0 1 3 4 5 6 7 8 9