「對比Python學習Go」- 流程控制

本篇是「對比Python學習Go」 系列的第五篇,本篇文章咱們來看下Go的流程控制語法。本系列的其餘文章可到 「對比Python學習Go」- 開篇 查看。html

編程語言的中的經常使用的流程控制語法主要分爲以下幾類:python

  • 順序結構:顧名思義,從上往下順序依次執行。
  • 分支結構:根據必定的條件,來判斷執行的分支。
  • 循環結構;根據必定的條件,來循環執行一個代碼塊,當知足條件,循環退出。
  • 跳轉結構:執行到關鍵字時,跳轉到指定代碼塊繼續執行。

知道了上邊的結構,下面咱們來看下GO語言中的流程控制結構。linux

Go 語言中的順序結構

順序結構很簡單,咱們以前寫的代碼幾乎都是順序結構。代碼從上往下依次執行,並無條件判斷的分支、循環和跳轉。golang

Python 中順序結構也是如此,代碼從上往下依次執行。編程

Go 語言中的分支結構

Go 語言中的分支結構,由條件和代碼塊組成,代碼塊使用大括號包括。主要有以下兩中:markdown

  • 使用關鍵字 ifelseelse 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中就簡單的多了。主要有關鍵字ifelseelif來控制。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 語言中的循環結構

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的打印報錯,咱們能夠看出,forif 同樣,也是有本身獨立的做用域。

再看Python 的循環結構,有forwhile兩種關鍵字來實現,主要用法以下:

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)
複製代碼

經過對比咱們能夠看到循環結構主要用來作兩件事:

  • 第一,遍歷複雜結構,如列表、字典或map ;
  • 第二,經過條件表達,來循環執行一個代碼塊;

只不過在Go中,使用for 來實現了上邊的兩種功能,在Python中,使用for 來遍歷複雜結構,使用while來循環執行條件代碼塊。

總結

本篇中,咱們來對比學習了Go中的流程控制結構。分支結構和循環結構在Go中都是有本身的獨立做用域的。在Python中,則沒有獨立做用域。在使用中,必定要注意。這種無獨立做用域問題,在Python中,常被叫作"做用域溢出",這是一種語法的習慣問題,在實際的編程中常常會犯錯誤。Go的獨立做用域則完全避免了這種做用域的問題。

我是DeanWu,一個努力成爲真正SRE的人。

關注公衆號「碼農吳先生」, 可第一時間獲取最新文章。回覆關鍵字「go」「python」獲取我收集的學習資料,也可回覆關鍵字「小二」,加我wx拉你進技術交流羣,聊技術聊人生~

相關文章
相關標籤/搜索