分享幾個 Go 語言中編程技巧
- 前言
在 Golang 語言中,有多種聲明變量的方式,但是每種方式都有它特殊的功能,本文我們介紹一些關於變量的編程技巧。
- 編程技巧
類型推斷
類型推斷就是在聲明一個變量時,不指定變量的數據類型,變量的數據類型由右值推斷得到。
Golang 語言是一門靜態類型的編程語言,我們聲明變量或常量時,需要指定變量或常量的數據類型,我們可以顯示指定變量的數據類型,也可以使用 Golang 語言的類型推斷。
func main () {
var name string
name = "frank"
fmt.Printf("val:%s type:%T\n", name, name)
}
閱讀上面的代碼,我們聲明變量 name 的數據類型是 string,看上去也沒什麼問題,那麼,我們再來看一段代碼。
func main () {
var name string
name = getVal()
fmt.Printf("val:%s type:%T\n", name, name)
}
func getVal () string {
return "frank"
}
閱讀上面這段代碼,我們將變量 name 的賦值改爲使用函數表達式賦值。目前 getVal()
函數的返回結果的數據類型是 string,如果未來我們需要修改 getVal()
函數的返回結果的數據類型爲 int,我們 main 函數中的變量 name 也需要進行對應的修改,這樣使得我們的應用程序不靈活,增加了我們維護(重構)代碼的難度。
如果我們在聲明變量 name 時,不使用指定數據類型的方式,而是通過簡短聲明的方式(也可以使用 var 變量名 = 表達式
的語法)使用 Golang 語言的類型推斷功能,上述的問題就解決了。如果你使用過動態類型(弱類型)的編程語言,比如 Python 或 PHP,是不是感覺這種方式,可能會有所感觸。
func main () {
// var name = getVal()
name := getVal()
fmt.Printf("val:%s type:%T\n", name, name)
}
// func getVal () string {
// return "frank"
// }
func gateVal () int {
return 1
}
重新聲明變量
所謂重新聲明變量,就是將已經存在的變量重新定義,使用簡短聲明變量的方式,將同一代碼塊中的變量重新聲明。
重新聲明變量有一些前提條件:
-
重新聲明變量,必須使用簡短聲明方式。
-
重新聲明變量,不能修改原變量的數據類型。
-
重新聲明變量,左邊的變量至少包含一個未聲明過的變量。
-
重新聲明變量,只作用於同一代碼塊中的變量。
我們瞭解了重新聲明變量,不知道有沒有體會到它的好處,在我看來,重新聲明變量的好處就是可以減少代碼量。
未使用重新聲明變量:
func main () {
var name string
name = "lucy"
var age uint
age = 18
name = "frank"
fmt.Printf("name:%s age:%d\n", name, age)
}
使用重新聲明變量:
func main () {
var name string
name = "lucy"
name, age := "frank", 18
fmt.Printf("name:%s age:%d\n", name, age)
}
閱讀上面這兩段代碼,我們發現使用簡短聲明的方式重新聲明變量 name,無需關心被賦值的變量中是否已存在,而且可以減少代碼量,並且必須使用簡短聲明的方式,因爲如果使用 var 關鍵字聲明已存在的變量會引發編譯錯誤。
同名變量
所謂同名變量,是指在不同代碼塊,相同變量名的變量,因爲在同一代碼塊,變量名相同會引發編譯錯誤。
package main
import (
"fmt"
)
var a = 1
func main () {
a := "golang"
fmt.Printf("val:%s type:%T\n", a, a)
}
閱讀上面這段代碼,我們分別在 main 包代碼塊和 main 函數代碼塊聲明瞭變量 a,通過打印結果可以看出打印的是 main 函數中的變量 a。該示例代碼說明位於不同代碼塊的同名變量,因爲其作用域也不同,所以不會引發編譯錯誤。
- 總結
本文我們介紹了關於變量的一些編程技巧,包括類型推斷,重新聲明變量和同名變量。如果用好這些關於變量的編程技巧,可以有效提升代碼的可維護性和健壯性。
參考資料:
https://tour.go-zh.org/basics/14
https://docs.hacknode.org/gopl-zh/ch2/ch2-03.html
https://docs.hacknode.org/gopl-zh/ch2/ch2-07.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/yXOmU5Clf0JvxB9I_758CA