常量 - Go 語言學習筆記

Go語言常量的定義

常量是一種表達式,在程序編譯階段就計算出其值,在程序運行時沒法改變該值,從而使編譯器得以知曉其值(編譯優化),減小運行時的錯誤,提高運行時的性能。golang

全部常量的數據類型都屬於基本類型:布爾型、數字型(整數型、浮點型和複數)和字符串型。數組

常量做爲操做數時,全部算術運算、邏輯運算和比較運算的結果依然是常量,常量的類型轉換結果和某些內置函數的返回值,例如len、cap、real、imag、complex和unsafe.Sizeof,一樣是常量。bash

Go語言常量的聲明

常量的聲明格式:ide

const identifier [type] = value
複製代碼

能夠省略類型說明符 [type],由於編譯器能夠根據右邊的表達式來推斷其類型。函數

  • 顯式類型定義: const b string = "abc"性能

  • 隱式類型定義: const b = "abc"優化

多重賦值的聲明能夠簡寫爲:ui

const c_name1, c_name2 = value1, value2
複製代碼

批量聲明常量:spa

const (
    Unknown = 0
    Female = 1
    Male = 2
)
複製代碼

Go語言常量的應用

由於常量是在編譯器肯定的,所以能夠做爲一些複雜類型的組成部分,好比數組類型的長度:code

const IPv4Len = 4
var p [IPv4Len]byte
複製代碼

由於常量做爲操做數時返回結果仍然爲常量,所以常量能夠用len()、cap()、 unsafe.Sizeof()函數計算表達式的值。常量表達式中,函數必須是內置函數,不然編譯不過:

import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)
fmt.Println(a, b, c) // abc 3 16
複製代碼

批量聲明常量時,除了第一個常量,其它常量聲明時的右邊表達式均可以省略。若是某個常量的右邊表達式缺失,則該常量的值和類型等於前面常量的值和類型,例如:

const (
    a = 1
    b
    c = 2
    d
)
fmt.Println(a, b, c, d) // 1 1 2 2
複製代碼

實際應用中,上面的代碼並無太多實用價值,可是能夠利用它實現iota語法。

iota

iota是golang語言的常量計數器,只能在常量的表達式中使用,屬於特殊常量,能夠認爲是一個能夠被編譯器修改的常量。

iota在const關鍵字出現時將被重置爲0(const內部的第一行以前),const中每新增一行常量聲明將使iota計數一次(iota可理解爲const語句塊中的行索引)。

理解:

  1. iota只能在常量的表達式中使用, 反之 fmt.Println(iota) 編譯錯誤: undefined: iota
  2. 每次 const 出現時,都會讓 iota 初始化爲0。
const a = iota    // a = 0 
const ( 
  b = iota        // b = 0 
  c               // c = 1 
)
複製代碼

iota 用法

  1. iota 能夠被用做枚舉值
const (
    a = iota
    b = iota
    c = iota
)
複製代碼
  1. 自定義類型

自增加常量常常包含一個自定義枚舉類型,容許你依靠編譯器完成自增設置。

type Weekday int
const (
    Sunday Weekday = iota   // 0
    Monday                  // 1
    Tuesday                 // 2
    Wednesday               // 3
    Thursday                // 4
    Friday                  // 5
    Saturday                // 6
)
複製代碼
  1. 可跳過的值

可使用下劃線跳過不想要的值

type AudioOutput int
const ( 
    OutMute AudioOutput = iota  // 0
    OutMono                     // 1
    OutStereo                   // 2
    _                           // iota += 1
    _                           // iota += 1
    OutSurround                 // 5 
)
複製代碼
  1. 使用位掩碼錶達式定義數量級
const (
    _ = 1 << (10 * iota)
    KiB     // 1024
    MiB     // 1024 * 1024
    GiB     // 1024 * 1024 * 1024
)
複製代碼
  1. 定義在一行的狀況 iota 在下一行增加,而不是當即取得它的引用。
const (
    Apple, Banana = iota + 1, iota + 2      // Apple:1, Banana:2 
    Cherimoya, Durian                       // Cherimoya:2, Durian:3
    Elderberry, Fig                         // Elderberry:3, Fig:4
)
複製代碼
  1. 中間插隊
const ( 
    i = iota    // i = 0
    j = 3.14    // j = 3.14, iota += 1
    k = iota    // k = 2, iota += 1
    l           // l = 3
)
複製代碼
相關文章
相關標籤/搜索