代码示例:

    sum :=
for i, j := , ; i <= && j <= ; i, j = i+, j- {
t.Log("i: ", i)
t.Log("j: ", j)
sum += i + j
}
t.Log("sum: ", sum)

Go中的控制语句较精简,仅有if、for、select和switch。但使用时均比较灵活

if

在Go中条件语句*if*中如果条件部分的计算结果为**true**时将执行语句块,否则则执行else语句块(如果存在else时),此逻辑和其他语言中的if一样,但是在Go中还是有一些不同之处。

  • if条件表达式不能使用花括号**()**包含
  • if语句代码段必须使用**{}**,并且左括号必须和if在同一行
  • if条件表达式的前面可以包含初始化语句,支持平行赋值,但不支持多个赋值语句

赋值+条件判断

if a, b := 21, 3; a > b {
fmt.Println("a>b ? true")
}

在if条件表达式前面声明的的变量只能在if-else语句块中使用。

if a, b := 21, 31; a > b {
fmt.Println("a>b ? true")
}else {
fmt.Println(a,b) //Ok
}
fmt.Println(a,b) //error: undefined a ,undefined b

还需要注意的是如果在if-else 中包含return 时,编译器无法解析出else中的retrun,导致方法缺少return ,目前1.1版本已支持该方式。

func getName(id int) string {
if id == 1 {
return "YourName"
}else {
return "MyName"
}
//panic("")
}

此代码编译不通过,错误信息:function ends without a return statement,这是在设计Go时故意这样的,也可以说是一个Bug(可参见:https://code.google.com/p/go/issues/detail?id=65),这是一种编码风格,即在if语句块中去做return处理,而else中不处理,而是继续执行if-else后面的代码,这样能减少一个代码缩进,不需要在了解代码时去记住else语句块的处理。当然如果想必须这样写,也可以进行特殊处理,在函数的末行添加语句**panic("")**

在if中可以包含初始化语句,这是非常实用的。例如在文件处理,取字典项时需要判断是否执行操作成功,只有在成功时才能继续处理,这样就可以通过if-else处理。

if err := file.Chmod(0664); err != nil {
log.Print(err)
return err
} if v,err :=myMap[key];err != nil {
log.Print(err)
return err
}else {
//do something with v
}

for

在Go中其他循环遍历的控制语句,唯有for。而for同样也是比较灵活的,for有三种形式。

  • 普通用法 for init; condition;post {}
  • while for condition {}
  • 死循环 for {}

由于Go没有逗号表达式,而++和--是语句而不是表达式,如果想在for中执行多个变量,需要使用平行赋值

for i, j := 1, 10; i < j; i,j=i+1,j+1 {  //死循环
fmt.Println(i)
}

而不能写成

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

for的condition在每执行一次循环体时便会执行一次,因此在实际开发过程中需要注意不要让condition中计算简单而不是复杂。

for i,j :=0,len(str); i<j ; i++ {
fmt.Println(str[i])
}

而不要写成(这仅是一个演示而已)

for i=0; i< len(str); i++ {
fmt.Println(str[i])
}

另外for是遍历string,array,slice,map,chanel的方式,而使用保留字rang则能灵活的处理。rang是迭代器,能根据不同的内容,返回不同的东西。

  • for index,char := range string {}
  • for index,value := range array {}
  • for index,value := range slice {}
  • for key,value := range map {}

需要注意的是for+rang遍历string时得到的是字节索引位置和UTF-8格式rune类型数据(int32)。

for pos, value := range "Go在中国" {
fmt.Printf("character '%c' type is %T value is %v, and start at byte position %d \n", value,value,value, pos)
str :=string(value) //convert rune to string
fmt.Printf("string(%v)=>%s \n",value,str)
}
---------OutPut------------ 一个汉字占三个字节
character 'G' type is int32 value is 71, and start at byte position 0
string(71)=>G
character 'o' type is int32 value is 111, and start at byte position 1
string(111)=>o
character '在' type is int32 value is 22312, and start at byte position 2
string(22312)=>在
character '中' type is int32 value is 20013, and start at byte position 5
string(20013)=>中
character '国' type is int32 value is 22269, and start at byte position 8
string(22269)=>国

break和continue

另外在循环中使用break和continue,break用于退出循环,continue用于终止本次循环体的执行继续执行下一个循环。

sum := 0
for {
if sum > 10 {
break
}
sum += 2
}
fmt.Println(sum) // sum=12

break也可退出指定的循环体

    sum := 0
myforLable:
for {
for i := 0; i < 10; i++ {
if sum > 200 {
break myforLable //将退出循环体for{}
}
sum += i
}
}
fmt.Println(sum)

switch

switch是最灵活的一种控制语句,表达式可以不是常量或者字符串,也可以沒有表达式,如果没有表达式则如同if-else-else。

一般用法:和其他语言的Switch基本一样,不同的不需要在每个Case中添加Break,而是隐藏了Break,当然你可以显示加入break

switch ch {
case '0':
cl = "Int"
case '1':
cl = "Int"
case 'A':
cl = "ABC"
break //可以添加
case 'a':
cl = "ABC"
default:
cl = "Other Char"
}

此段代码可以可写成(fallthrough表示继续执行下面的Case而不是退出Switch)

switch ch {
case '0':
fallthrough //必须是最后一个语句
case '1':
cl = "Int"
case 'A':
case 'a':
fallthrough
cl = "ABC" //error
default:
cl = "Other Char"
}

如果多个匹配结果所对应的代码段一样,则可以在一个case中并列出所有的匹配项

switch ch {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
cl = "Int"
case 'A', 'B', 'C', 'D', 'a', 'b', 'c', 'd', 'e':
cl = "ABC"
default:
cl = "Other Char"
}

同样switch可以没有表达式,在 Case 中使用布尔表达式,这样形如 if-else

switch {
case '0' <= ch && ch <= '9':
cl = "Int"
case ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'):
cl = "ABC"
default:
cl = "Other Char"
}

下面是Switch写的一个示例(无实际意义):

func Compare(a, b interface{}) (int, error) {
aT := reflect.TypeOf(a)
bT := reflect.TypeOf(b)
if aT != bT {
return -2, errors.New("进行比较的数据类型不一致")
} switch av := a.(type) { default:
return -2, errors.New("该类型数据比较没有实现")
case string:
switch bv := b.(type) {
case string:
return ByteCompare(av, bv), nil
}
case int:
switch bv := b.(type) {
case int:
return NumCompare(av, bv), nil
} } return -2, nil
}

select

还有另一个控制语句select,在讨论chan 时再来学习

参考资料:

http://www.cnblogs.com/howDo/archive/2013/06/01/GoLang-Control.html

【GoLang】GoLang for 中有多个循环变量怎么处理?的更多相关文章

  1. 数据结构和算法(Golang实现)(2)简单入门Golang-包、变量和函数

    包.变量和函数 一.举个例子 现在我们来建立一个完整的程序main.go: // Golang程序入口的包名必须为 main package main // import "golang&q ...

  2. R语言里面的循环变量

    for (i in 1:10) { print("Hello world") } 以上这条命令执行完之后,变量i会被保存下来!并且,i的值将是10. 程序中有多处循环的时候要非常注 ...

  3. django模板里循环变量<table>里想要两个一行如何控制

    2016-8-3 周三 做项目时遇到的问题: 每个div由循环变量输出: {% for key,value in formextenddetail %} <div id="div_id ...

  4. Javascript中的循环变量声明,到底应该放在哪儿?

    相信很多Javascript开发者都在声明循环变量时犹豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪一种方式和ecma标准 ...

  5. 在Lambda表达式中使用循环变量

    在C#5.0之前,如果在foreach循环中的lambda表达式里使用循环变量,那么你会发现一些意想不到的现象,例子如下: , , , }; var actions = new List<Act ...

  6. THINKPHP5 volist标签循环不能设置循环变量为$i

    在thinkphp5的volist标签中不要用$i作为id,举个简单例子 控制器这样写 模板这样写 结果是 这很令人费解啊.然后换一个循环变量看看 循环正常了,看来这个id这里设置循环变量的时候 不能 ...

  7. JS中for循环变量作用域--解决for循环异步执行的问题

    被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...

  8. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制

    不可在 for 循环体内修改循环变量,防止 for 循环失去控制. #include <iostream> /* run this program using the console pa ...

  9. JAVA for循环语句的循环变量类型问题

    class HalfDollars { public static void main(String [] arguments) { int[] denver = {1_900_000,1_700_0 ...

随机推荐

  1. yum -y install与yum install有什么不同

    yum -y install 包名(支持*) :自动选择y,全自动 yum install 包名(支持*) :手动选择y or n yum remove 包名(不支持*) rpm -ivh 包名(支持 ...

  2. [Unity] UGUI研究院之游戏摇杆

    最近在做Unity基于UGUI的摇杆,发现了一种非常简单并且巧妙的方法,原文在这里, 不过要FQ!!http://godstamps.blogspot.tw/2015/07/unity-ugui-sc ...

  3. swoole 教程

    环境安装:http://blog.csdn.net/ldy3243942/article/details/40263735 Task使用以及swoole_client:http://blog.csdn ...

  4. dom.style.left 与 dom.offsetLeft区别

    dom.style.left    初始空值,必须在html行内样式定义值才有值,在css样式定义仍为空值                         可读写,是字符串,读写是必须加px,否则无效 ...

  5. VIP卡

    VIP卡:http://item.taobao.com/item.htm?id=6826715667&ali_refid=a3_420435_1006:1102617497:6::683ff3 ...

  6. tinyfox for linux 独立版 fox.sh

    #!/bin/sh export LANG="zh_CN.UTF-8" # export MONO_IOMAP="all" # export MONO_EXTE ...

  7. nanosleep() -- 更精确的延迟 -----一个使用用例

    [常规] nanosleep() -- 更精确的延迟 [复制链接]     beyes 4220 主题 5152 帖子 3万 积分 GROAD 曲径通幽,安觅芳踪. 积分 30607 发消息 电梯直达 ...

  8. 给各位聚聚和大大介绍一个开源项目 Expression2Sql(转)

    阅读目录 一.Expression2Sql介绍 二.单表简单查询 三.Where条件 四.多表关联查询 五.group by 六.order by 七.函数 八.delete 删除 九.update ...

  9. shell学习之路:流程控制(for)

    for循环的语法: 1.  for 变量 in 值1 值2 值3.... do 程序 done 例如:下列脚本会分别打印4次 分别是morning noon afternoon evening的值 # ...

  10. for 循环中 i++和 ++i

    在标准C语言中, i++和 ++i的区别显而易见. 但是,当在for循环中使用 i++和 ++i的时候,会发现.只要这两种语句不用来赋值操作(作为右值,赋值给左值),那么这两种写法其实是一样的. fo ...