【从零开始捡起GO】5. 基本的逻辑语句

本篇大概只会讲语法。如果基础逻辑不懂的话可以找找其他文章了解

基本逻辑语句

if - else

基本格式:

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
} else {
  /* 在布尔表达式为 false 时执行 */
}

和php略有不同的是,if 布尔表达式表达式不需要()

switch

基本格式:
package main

import "fmt"

const (
	a = iota
	b
)

func main() {
	target := 0
	switch target {
	case a:
		fmt.Println("target=a")
	case b:
		fmt.Println("target=b")
	default:
		fmt.Println("target=?")
	}
}

输出:

0=a
这里和php有一些不一样的地方

对比的php代码:

$a = 1;
$b = 2;
$c = 1;

switch (2){
    case $a:
        var_dump("是a");
    case $b:
        var_dump("是b");
    case $c:
        var_dump("是c");
    default:
        var_dump("不知道");
}

输出:

string(4) "是b"
string(4) "是c"
string(9) "不知道"
  1. golang中不需要break,在命中case后会自动跳出。而在php的switch中,命中后只要没有break会直接向下执行的。

  2. golang中是不允许重复的case的,重复的case在编译时会报错duplicate case b (value 1) in switch previous case at ...,而php中可以存在重复的case

多条件判断

多条件判断可以在case中用||或运算或者用,隔开

  1. case a < target || true
  2. case a < target , true
fallthrough

想要实现和php一样的效果(即进入case后无条件执行下面的动作)可以在case中加入关键字 fallthrough

package main

import "fmt"

func main() {
	a := 0
	b := 1
	target := 2
	switch true {
	case a < target:
		fmt.Println("target=a")
		fallthrough
	case b < target:
		fmt.Println("target=b")
		fallthrough
	case true:
		fmt.Println("this is a true")
	default:
		fmt.Println("target=?")
	}
}

输出

target=a
target=b
this is a true

也就是说,在php中,不加入任何关键字会自动执行类似golang中的fallthrough,而golang中不加入任何关键字会执行类似php中的break(golang中也有break)

select

select是和通道相关的操作,在说到通道的时候再说吧

循环

for循环

golang的for循环有3种写法

  1. for init; condition; post { }
  2. for condition { }
  3. for { }
for init; condition; post { }

最基础的判断

  1. init是变量的初始化
  2. condition判断条件
  3. post是变量的变化
package main

import "fmt"

func main() {
	for i := 0; i < 10 ; i++  {
		fmt.Print(i," ")
	}
}

输出

0 1 2 3 4 5 6 7 8 9 

其中,init可以在外部定义,但是;不能少

package main

import "fmt"

func main() {
	i := 0
	for ; i < 10; i++  {
		fmt.Print(i," ")
	}
}

输出结果一致

for condition { }

这个类似于while()do{},condition成立的话会执行循环体内的代码

package main

import "fmt"

func main() {
	i := 0
	for i < 10 {
		fmt.Print(i," ")
		i++
	}
}

输出结果一致

for { }

最简单最简单的死循环了,相当于php中的while(true){}

package main

import "fmt"

func main() {
	i := 0
	for {
		fmt.Print(i," ")
		i++
		if(i > 9){
			break
		}
	}
}

输出结果一致

常用的特殊用法

使用for+range可以轻松做到循环数组(相当于php中使用foreach),代码之前也贴过一次,这里再贴一次

package main

import "fmt"

func main() {
	var arr = [5]int{0,1,2,3,4}
	for _,v := range arr{
		fmt.Println(v)
	}
}

输出

0
1
2
3
4
break

和其他语言一样,跳出整个循环

continue

和其他语言一样,跳出单次循环体

最没牌面的goto

一直觉得很奇怪,goto每个语言都会提到,但是每个语言都会说千万千万不要用goto。而我在写批处理的时候有大量使用过goto,也算亲身体会过goto带来的方便和不便。

鉴于有很多基础薄弱的萌新并不知道goto这个没牌面的语句,这里稍微说一样我对goto的理解:

goto相当于跳过当前的逻辑,直接执行goto指定的标签位置继续执行。这个语句其实非常好用(如果自己开发的话而且是小项目),但是多人开发或者一个需要长久维护的项目中goto就会让代码非常难以阅读。。。

先上个代码

package main

import "fmt"

func main() {
	i := 0
	add:
	i++
	fmt.Print(i," ")
	if(i < 9){
		goto add
	}
}

输出

1 2 3 4 5 6 7 8 9

上面的代码中。只要i < 9就会从add:处重新执行代码,单个还能看过来,如果出现多个goto标签或者goto和goto嵌套,那就蒙圈了。。。比如学习循环的第一课:99乘法表用goto来写

package main

import "fmt"

func main() {
	i := 1
	j := 1
addi:
	fmt.Println()
	addj:
		fmt.Print(i,"*",j,"=",i*j," ")
		if(j < 9 && j < i){
			j++
			goto addj
		}
	if(i < 9){
		i++
		j=1
		goto addi
	}
}

输出

1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

怎么样,是不是一个最基础的循环都能把你看蒙圈(好像并不,但是就是这个意思)

总结

入门思维导图下载(使用xmind打开):golang.xmind

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论