[golang] 數據類型及變量

劉哇勇 2021-09-18 09:33:01 阅读数:923

golang

零值

未顯式指定初始值的變量會自動獲取零值,具體來說,

  • 整形:0
  • 浮點:0.0
  • 布爾類型:false
  • 字符串:"" (空字符串)
  • interfaces,slices,channels,maps,pointers 及 functions: nil

字面量

  • 對於數字字面量,可在值中穿插 _ 分隔以提高可讀性,比如每三個數字之間插入 1_234

整形

  • 根據可存儲大小,整形分很多種,一些常用的類型有自己的別名
    • byte: uint8
    • int: int32/int64, 依平臺而定
    • uint: 同 int 只不過是無符號類型
    • rune:用來錶示字符,值同 int32
    • TODO: uintptr

類型怎麼選

  • 大部分場景直接用 int
  • 操作二進制文件,網絡編程中協議及符號處理,使用對應大小的整形類型
  • 編寫庫函數需要兼容所有整形,則准備兩個函數,一個使用 int64 一個用 uint64

浮點型

大部分情况直接用 float64

注意:

  • 浮點不能精准錶示數字,所以不要用於金錢等需要高精度的情形。
  • 也是因為不精准的原因,不要使用 ==, != 來對比兩個浮點數。正確的做法是相减,判斷差值是否在預期範圍內。

變量的聲明

Go 中支持多種方式靈活聲明變量。

  • 完整的聲明形式,包含類型同時賦值
var x int = 1
 
  • 有初始值的情况下,可省略類型
var x = 1
 
  • 當然也可次聲明了不賦值,此時需要指定類型
var x int
 
  • 可同時聲明多個變量,甚至包含不同類型
var foo, bar int
var x,y = 1, "hello"
 
  • 聲明多個變量時,也可將其放入變量列錶中
var (
x int
y, z int = 1, 2
m, foo = 9, "foo"
bar = "hello"
)
 

:= 操作符

另一個常用的形式是縮寫形式,但僅限於函數體內,使用 := 符號來聲明和初始化變量

x := 10
// 等效於
var x int = 10
// 
m, foo := 10, "hello"
 

同時聲明多個變量的方式也適用於該操作符:

m, foo := 10, "hello"
 

該形式不僅可用來聲明新的變量,還可同時設置已有變量,前提是符號左邊至少有一個新聲明的變量即可。

var x = 10
x, y := 11, "hello"
fmt.Println(x, y)
// 11 hello
 

const 常量

const 聲明的常量是編譯時的,即聲明時必需初始化,且用來初始化的值是已經確定的。

常量分為有類型(Typed)與無類型(UnTyped)常量,前者在賦值時需要目標變量類型匹配,後者沒有這個限制。

  • 有類型常量
const x float64 = 3.3
var y float64 = x
var z int = x // cannot use x (constant 3.3 of type float64) as int value in variable declarationcompilerIncompatibleAssign
 
  • 無類型常量
const x = 3
var y float64 = x
var z int = x // 
 

變量名

和其他語言不同,對於變量名,Go 中僅要求以下劃線或字母開頭,所使用的字母可以是任意 Unicode 字符,所以如下示例中都是合法的變量名:

_x := 1
 := "a symbol"
π := 3.14
 

雖然變量名中支持包含下劃線,但不提倡使用蛇形 (snack case)命名法,推薦使用駝峰。

函數名盡量簡潔,甚至大部分情况下提倡使用單個字母,比如 for-range 語法中使用 k v 代錶 key value 循環變量,一般 for 循環中常用 i j 作為計數器。簡寫變量名的好處一是使得代碼簡潔,書寫高效;另一個好處是不容易寫出邏輯複雜的代碼塊,如果發現變量名不容易維護了,說明應該考慮將邏輯進行拆分而不是揉在一起。

如果是全局包變量,則恰恰相反,應該盡量取得詳盡一些。

相關資源

The text was updated successfully, but these errors were encountered:

版权声明:本文为[劉哇勇]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918093300748O.html