java程序员 数据结构
Go (Golang)只有三个基本控制结构。 但是,它们每个都比Java同行更具通用性。
如果
if语句应立即可识别。 它的基本形式与Java中的形式相同,只是条件之间没有括号:
...
if err != nil {
fmt.Println("An error occurred!")
}
...
但是,Go的版本在两个方面与Java的版本不同。 首先,当if语句的主体仅是一行时,Java允许您省略左花括号和右花括号:
...
if(inputString == null) return "null";
...
另一方面,Go对格式良好且可读的代码有强烈的见解(有关更多信息,请参阅下一篇文章)。 Go if语句无论在什么情况下都需要左括号和右括号:
...
if inputString == null {
return "null"
}
...
其次,Go通过灵活的初始化功能弥补了这一限制。 在if声明本身内部,可以将初始化语句放在条件之前:
...
if err := os.Remove("data.csv"); err != nil {
fmt.Println("Unable to delete the file 'data.csv'")
}
...
在这里,if语句执行文件删除操作,如果删除失败,则返回一个填充的错误变量。 然后条件检查该值,如果条件为真,则进入if块。
与仅在if语句上方的单独一行上执行文件删除操作相反,为什么要这样做呢? 这种方法的关键特征是在初始化语句中创建的变量的范围仅限于 if 块 。
上面的示例代码片段是Go中非常常见的模式,本系列的后续文章将更全面地处理错误处理。 但是,关键是该初始化构造可以创建在if条件之前需要在范围内但在if块之后超出范围的任何变量。
对于
Go中的基本for循环同样类似于其Java对应物。 它包含一个初始化语句,在每次迭代之前要检查的条件以及在每次迭代之后要执行的代码。 唯一的区别是,这三件事没有paretheses:
...
for index := 0; index < 10; index++ {
fmt.Printf("index == %d", index)
}
...
但是,除了基本版本外,for循环还有其他两种形式。 Go 在Java 中没有 while 或 do 循环控制结构 ,因此其他for循环形式在其位置覆盖了相同的功能。
如果您编写的for语句仅包含条件,而没有初始化或迭代后代码,则它实质上是Java while循环:
...
for len(slice) < maxSize {
slice = append(slice, getNextItemToAdd())
}
...
当然,您可以通过为初始化和/或迭代后部分插入空语句来对Java for循环执行类似的操作。 但是,严格来说,Java版本始终需要三个部分。 您必须为要用空语句填充的部分插入分号。 在Go中,仅条件构造是一种独特的for循环类型,并且不需要占位符分号。
在第三种for循环形式中,您甚至可以省略条件。 这将创建一个无限循环,需要一个break语句在某个点终止。
...
consoleReader := bufio.NewReader(os.Stdin)
for {
command, hasMoreInLine, err := bio.ReadLine()
if err != nil || command == "exit" {
// The user typed an "exit" command (or something went wrong). Time to exit this loop!
break;
}
// do something based on the command typed
}
...
最简单的for循环是与Java等效的Go:
...
while(true) {
String command = System.console().readLine();
if(command.equals("exit")) {
break;
}
// do something based on the command typed
}
...
开关
在Java中,switch语句根据某个变量的值执行一个或多个代码块。 在Java的大部分历史中,尽管Java 7最终添加了对String的支持,但您只能打开基本类型或枚举类型变量。
...
switch(deviceType) {
case "PHONE" :
renderForPhone();
break;
case "TABLET" :
renderForTablet();
break;
case "DESKTOP" :
renderForDesktop();
break;
default :
System.out.println("Unrecognized device: " + deviceType);
}
...
在Go中,switch语句不仅将变量与可能匹配的列表进行比较。 相反,Go开关可测试多种自由形式的条件。 这些条件可能彼此完全不相关,并且每个条件都可以随您喜欢而复杂。 通过的第一个条件将执行其相应的代码:
...
switch {
case customerStatus == "DELINQUENT" :
rejectOrder()
case orderAmount > 1000 || customerStatus == "GOLD_LEVEL" :
processOrderHighPriority()
case orderAmount > 500 :
processOrderMediumPriority()
default :
processOrder()
}
除了灵活的用例条件外,与Java切换的另一个关键区别是Go的版本没有落空。 在Java中,switch语句可能执行多个case块。 如果您没有在case块的末尾放置break语句,那么还将对下一个case条件进行匹配评估。
使用Go,switch语句基本上只是编写一系列杂乱的if-else块的更干净的方法。
结论
if,for和switch关键字与Java关键字极为相似。 但是,它们每个都提供了扩展的灵活性,可帮助您编写更清晰简洁的逻辑。 在Go for Java Programmers系列的下一篇文章中,我们将研究Go格式良好的代码的特定规则。
翻译自: https://www.javacodegeeks.com/2014/03/go-for-java-programmers-control-structures.html
java程序员 数据结构