分享幾個 Go 語言中編程技巧

  1. 前言

在 Golang 語言中,有多種聲明變量的方式,但是每種方式都有它特殊的功能,本文我們介紹一些關於變量的編程技巧。

  1. 編程技巧

類型推斷

類型推斷就是在聲明一個變量時,不指定變量的數據類型,變量的數據類型由右值推斷得到。

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。該示例代碼說明位於不同代碼塊的同名變量,因爲其作用域也不同,所以不會引發編譯錯誤。

  1. 總結

本文我們介紹了關於變量的一些編程技巧,包括類型推斷,重新聲明變量和同名變量。如果用好這些關於變量的編程技巧,可以有效提升代碼的可維護性和健壯性。

參考資料:
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