与brack和continue不同,goto只有在C和go中才有。
goto作为跳转,需要定义一个label标签。这个标签决定跳转到哪里。并且break也可以配合标签使用,见示例3
goto示例1
但输入内容为c/u/r/d
,打印create,update,read,delete,如果输入都不是,就重新执行循环。也就是说只有输入c/u/r/d
程序才会结束。
代码如下:
package main
import "fmt"
func main(){
START:
fmt.Print("input:(c/u/r/d):")
var in string
fmt.Scan(&in)
for {
if in == "c"{
fmt.Println("create")
break
}else if in == "u" {
fmt.Println("update")
break
}else if in == "r" {
fmt.Println("read")
break
}else if in == "d" {
fmt.Println("delete")
break
}else if in != "c" && in != "u" && in != "r" && in != "d" {
goto START
}
}
}
跳出在 这里使用不等于!=
,如果输入的不等于就跳转到标签START。如果输入c/u/r/d
任意一个即可。
运行:
[root@marksugar /opt/Golang]# go run goto.go
input:(c/u/r/d):s
input:(c/u/r/d):.
input:(c/u/r/d):1
input:(c/u/r/d):2
input:(c/u/r/d):3
input:(c/u/r/d):a
input:(c/u/r/d):c
create
goto示例2
从1加到100的和,不用for循环
如果i小于100,就result就等于i,进行i++,跳转到START判断继续循环。直到大于100,就跳转到FOREND
代码如下:
package main
import "fmt"
func main(){
result := 0
i := 1
START:
for i>100 {
fmt.Println(i)
goto FOREND
}
result += i
i++
goto START
FOREND:
fmt.Println(result)
}
运行
[root@marksugar /opt/Golang]# go run goto2.go
101
5050
goto示例3
定义嵌套循环,分别i和j,i和j相乘,如果等于9就结束程序。使用break 和BREAKEND标签。代码如下:
package main
import "fmt"
func main(){
BREAKEND:
for i :=0;i<5;i++{
for j :=0; j<5;j++{
if i*j == 9 {
break BREAKEND
}
fmt.Println(i,j,i*j)
}
}
}
!!! notebreak的标签需要在循环层级之上,不能写在下面
运行:
[root@marksugar /opt/Golang]# go run brack2.go
0 0 0
0 1 0
0 2 0
0 3 0
0 4 0
1 0 0
1 1 1
1 2 2
1 3 3
1 4 4
2 0 0
2 1 2
2 2 4
2 3 6
2 4 8
3 0 0
3 1 3
3 2 6