本篇是「對比Python學習Go」 系列的第五篇,本篇文章咱們來看下Go的流程控制語法。本系列的其餘文章可到 「對比Python學習Go」- 開篇 查看。html
編程語言的中的經常使用的流程控制語法主要分爲以下幾類:python
知道了上邊的結構,下面咱們來看下GO語言中的流程控制結構。linux
順序結構很簡單,咱們以前寫的代碼幾乎都是順序結構。代碼從上往下依次執行,並無條件判斷的分支、循環和跳轉。golang
Python 中順序結構也是如此,代碼從上往下依次執行。編程
Go 語言中的分支結構,由條件和代碼塊組成,代碼塊使用大括號包括。主要有以下兩中:markdown
if
、else
和else if
來實現switch
來實現第一種,主要用法以下:編程語言
x:= 5.5
n:= 6.1
lim := 20.0
v := math.Pow(x, n)
// if 判斷
if v < lim {
fmt.Println(fmt.Sprint("v --->:",v))
}
// if 簡約形式,可賦值加判斷
if v := math.Pow(x, n); v < lim {
fmt.Println(fmt.Sprint("v --->:",v))
}
fmt.Println(fmt.Sprint("lim --->:",lim))
// if else
if v:=math.Pow(x,n);v<lim{
fmt.Println(fmt.Sprint("v --->:",v))
}else{
fmt.Println(fmt.Sprint("lim --->:",lim))
}
複製代碼
第二種,switch 應用:函數
// switch 後邊能夠直接跟值,也能夠賦值加值
os := runtime.GOOS
switch os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.", os)
}
switch os := runtime.GOOS; os {
// default 分支可聽任意位置
default:
fmt.Printf("%s.", os)
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
}
// switch也能夠沒有條件,在case處再判斷
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
複製代碼
switch 的條件從上到下的執行,當匹配成功的時候中止。若一個條件都不匹配,則會走 default 默認分支。oop
對比GO的分支結構Python中就簡單的多了。主要有關鍵字if
、else
、elif
來控制。post
# if 單獨使用
if '1':
print('這是真的')
# if 和 else 配合使用
if False:
print('這是假的')
else:
print('這是真的')
# if 和 elif 配合使用
if False:
print('這是假的')
elif True:
print('這是真的')
# 能夠橫向
a = '上午好' if now_time < 12 else '下午好'
複製代碼
這裏須要注意一個問題,Python 和GO 在分支語句中的做用域並不同。
// golang
m := 2
if n:=2; n !=0{
n = 1
fmt.Println(n) // 1
fmt.Println(m)
m = 4
}
fmt.Println(m) // 4
//fmt.Println(n) // undefined: n
複製代碼
從上邊的代碼執行結果,能夠看到,在GO語言中,if
語句中是一個封閉的做用域,內部能夠訪問外部的變量,外部不能夠訪問內部的變量。if
後邊的賦值語句的做用域是if結構內部的。
# python
m = 1
if m:
n = 2
print(n) # 2
print(m) # 1
m = 3
print(n) # 2
print(m) # 3
複製代碼
Python 中分支語句的做用域和外部是同一個做用域。內網可訪問外部的變量,外部也能夠訪問內部的變量。
Go語言中只有一種循環結構,使用 for
來實現。沒有其餘關鍵子,可是for
的功能獲得了增強。由初始化,條件表達式,後置語句組成,其中每一個部分均可以省略。
主要用法以下:
sum := 0
// 標準的for 寫法
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
//fmt.Println(i) // undefined: i
// 省略初始化語句
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
// 省略初始化和後置語句,用法相似python中的while
for sum < 1000 {
sum += sum
}
// 無限循環
for {
}
// 可以使用break 來退出信息,或使用continue 跳過本次循環的以後的語句
for i := 0; i < 10; i++ {
sum += i
if sum > 5{
break
//continue
}
fmt.Println(sum)
}
fmt.Println(sum)
// 遍歷列表
ids := []int{1,2,3,4,5,6}
for i, v := range ids{
fmt.Println(i, v)
}
// 遍歷map
own := map[string]string{
"name": "DeanWu",
"age": "30",
}
for k, v := range own{
fmt.Println(k, v )
}
複製代碼
從i
的打印報錯,咱們能夠看出,for
和if
同樣,也是有本身獨立的做用域。
再看Python 的循環結構,有for
和while
兩種關鍵字來實現,主要用法以下:
l = [1, 2, 3, 4, 5]
sum = 0
# 遍歷列表
for i in l:
sum += i
print(sum)
# 使用內建函數range 遍歷從1到5的整數
for i in range(1, 6):
sum += i
print(sum)
# 條件語句主要用while
while i <= 5:
sum += i
i += 1
print(sum)
# 無限循環
while True:
pass
# break 和 continue的使用
while True:
if sum > 10:
print('sum已大於10')
break
# continue
sum += 1
print(sum)
複製代碼
經過對比咱們能夠看到循環結構主要用來作兩件事:
只不過在Go中,使用for 來實現了上邊的兩種功能,在Python中,使用for 來遍歷複雜結構,使用while來循環執行條件代碼塊。
本篇中,咱們來對比學習了Go中的流程控制結構。分支結構和循環結構在Go中都是有本身的獨立做用域的。在Python中,則沒有獨立做用域。在使用中,必定要注意。這種無獨立做用域問題,在Python中,常被叫作"做用域溢出",這是一種語法的習慣問題,在實際的編程中常常會犯錯誤。Go的獨立做用域則完全避免了這種做用域的問題。
我是DeanWu,一個努力成爲真正SRE的人。
關注公衆號「碼農吳先生」, 可第一時間獲取最新文章。回覆關鍵字「go」「python」獲取我收集的學習資料,也可回覆關鍵字「小二」,加我wx拉你進技術交流羣,聊技術聊人生~