iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
Software Development

30天學會Golang系列 第 2

Day02 - Go的 const 常數宣告與 if / switch 判斷式

  • 分享至 

  • xImage
  •  

const常數宣告

常數宣告的方式與 var 的宣告方式相似,一般來說在定義常數時,變數字首會用大寫表示,若由多個字組成時,會用駝峰式命名,例如光速 (speed of light) 可定義為 LightSpeed

cosnt(
    Pi = 3.14
    Gravity = 9.8
    LightSpeed = 300000000
    // 在golang中以x為底的n次方表示為math.Pow(x, n),數學表達式為x^n
    // 但若是用LightSpeed = 3 * math.Pow(10, 8) 
    // 會出現以下錯誤math.Pow(10, 8) (value of type float64) is not constant
    // 因此在定義前先算完後直接寫成定值
)

n次方的特殊情況

在 x 的 n 次方情況下,一般會使用 math.Pow(x, n),但若遇到2的n次方時,也可以用其他的表達方式,透過 num << n 或是 num >> n 來表達 num * 2^n 或 num / 2^n ,分別為左移與右移 n 位,但這僅限用於 2^n 時可使用,也就是2進制的運算

func main() {
    multipliedBy8 := 3 << 3  // 24 (3 * 2^3 = 3 * 8 = 24)
    dividedBy8 := 16 >> 3  // 2 (16 / 2^3 = 16 / 8 = 2)
}

enum

go 語言實際上沒有 enum 型別,但可透過定義 常數(constant) 與 iota(自增值) 來模擬。 enum 的使用時機通常是為了管理多個同系列的常數,做為狀態的判斷所使用,並且提高程式的可讀性。

const (
    Black = iota  // 0
    Red           // 1
    Yellow        // 2
    Green         // 3
)

if與switch判斷式

if

在 go 語言中,if的寫法與其他程式語言類似,就不詳細說明,寫法如下

func main() {
    var n int // var n = ? (?的部份可自行定義)
    if n == 1 {
        fmt.Println("Traffic lights are now red")
    } else if n == 2 {
        fmt.Println("Traffic lights are now yellow")
    } else if n == 3 {
        fmt.Println("Traffic lights are now green")
    } else {
        fmt.Println("Traffic lights are now black")
    }
}

switch

與上述例子 if 對應的 switch 用法如下,比較特別的是相較於 c++ ,在 go 中的 case 不用在每個 case 後面加 break ,進入到相對應的 case 後,執行完該 case 就會跳出 switch ,不會執行其他的 case

func main() {
    var n int // var n = ? (?的部份可自行定義)
    switch n {
        case 1:
            fmt.Println("Traffic lights are now red")
        case 2:
            fmt.Println("Traffic lights are now yellow")
        case 3:
            fmt.Println("Traffic lights are now green")
        default:
            fmt.Println("Traffic lights are now black")
    }
}

判斷式結合enum

上面有提到 enum 的目的是為了增加程式的可讀性,可閱讀下面的範例,感受一下其中的差異

func main() {
    var n = 1
    switch n {
        case 1:
            fmt.Println("Traffic lights are now red")
        case 2:
            fmt.Println("Traffic lights are now yellow")
        case 3:
            fmt.Println("Traffic lights are now green")
        default:
            fmt.Println("Traffic lights are now black")
    }
    // 結果為: Traffic lights are now red
}

上面是沒有用 enum 的範例,下面是使用 enum 的例子

const (
    Black = iota  // 0
    Red           // 1
    Yellow        // 2
    Green         // 3
)
func main() {
    var n = Red
    switch n {
        case Red:
            fmt.Println("Traffic lights are now red")
        case Yellow:
            fmt.Println("Traffic lights are now yellow")
        case Green:
            fmt.Println("Traffic lights are now green")
        default:
            fmt.Println("Traffic lights are now black")
    }
    // 結果也是: Traffic lights are now red
    // 但可讀性明顯提升許多,在撰寫程式碼時也比較不容易出錯
}
第2天報到,有點靦腆,請多多指教

參考來源

  1. https://segmentfault.com/a/1190000041428406
  2. https://matthung0807.blogspot.com/2021/06/go-switch-case.html

代碼連結

https://github.com/luckyuho/ithome30-golang/tree/main/day02


上一篇
Day01 - Go的變數宣告與資料型態
下一篇
Day03 - Go的 map 與 struct
系列文
30天學會Golang31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言