代码示例:

    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. 登录验证码编写(jsp+servlet+dao)

    一.什么是验证码及它的作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码.刷 ...

  2. Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) (转)

    git pull的时候遇到 Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) y 于 ...

  3. gradle 的sourceCompatibility 与 targetCompatibility 区别

    sourceCompatibility:指定编译编译.java文件的jdk版本 targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的j ...

  4. [asp.net core]project.json(1)

    摘要 前面介绍了使用vs2015新建asp.net core web的内容,这篇文章学习下project.json文件的内容. project.json 原文:https://docs.microso ...

  5. [EWS]在exchange中的标识符

    摘要 最近在用ews的方式开发邮箱服务,包括写邮件,查看某封邮件的详情,回复,全部回复及转发功能.在获取收件箱的时候,关于唯一标识符的问题.也有点困惑,在每个邮件item中,存在一个changeKey ...

  6. 如何在本地配置php分析工具xhprof

    测试环境: linuxMint + nginx1.4.6+mysql5.5+php5.5 什么是xhprof? XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞时 ...

  7. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  8. 【转载】Unity 合理安排增量更新(热更新)

    原帖地址:由于我看到的那个网站发的这篇帖子很大可能是盗贴的,我就暂时不贴地址了.避免伤害原作者 原版写的有点乱,我个人修改整理了下. --------------------------------- ...

  9. [AngularJS] 入门

    什么是AngularJS AngularJS是Google开源的一款JavaScript MVC框架,弥补了HTML在构建应用方面的不足, 其通过使用指令(directives)结构来扩展HTML词汇 ...

  10. JQuery仿淘宝商家后台管理 之 管理添加分类

    先看一下效果图: 实现功能: 1.打开时加载分类信息,折叠所有分类 2.动态添加子类和父类 3.顺序的调整 4.无刷新删除,添加 5.保存到数据库 下面是HTML代码 : <title>分 ...