Golang 的資料型別一覽

閱讀時間約 10 分鐘


raw-image

👨‍💻簡介

Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括:

  • 整數、浮點數、布林值、字串

複合型別包括:

  • 陣列、片段、結構、函式、對映、通道、介面 等。

整數型別

整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。

你甚至可以使用 int 關鍵字,它會依據不同作業系統自動選擇大小:

  • 在 32 位作業系統:int 會變成 int32
  • 在 64 位作業系統:int 會變成 int64

但是,別忘了,數字型別還有其範圍和特點。


可以通過 unsafe.Sizeof 來查看不同長度的整數,在記憶體中的儲存空間。
var num2 = 12 fmt.Println(unsafe.Sizeof(num2))

轉換型別

要進行型別轉換,只需在變數前面指定目標型別即可。

var a1 int16 = 10
var a2 int32 = 12
var a3 = int32(a1) + a2
fmt.Println(a3)

但當高位轉低位時,可能會有精度損失。例如,從 16 位轉為 8 位,可能會有數據丟失。

var n1 int16 = 130
fmt.Println(int8(n1)) // 變成 -126

數值字面量(literal)

自 Go 1.13 版本起,你可以使用數值字面量語法,以二進制、八進制或十六進制格式來定義數字:

v := 0b00101101  // 代表二進制的101101
v := 0o377 // 代表八進制的377

進制轉換

你可以透過不同進制來表示數字,例如:

var number = 17
fmt.Printf("原樣輸出:%v\n", number)
fmt.Printf("十進制輸出:%d\n", number)
fmt.Printf("八進制輸出:%o\n", number)
fmt.Printf("二進制輸出:%b\n", number)
fmt.Printf("十六進制輸出:%x\n", number)

浮點數型別

Go 語言支援兩種浮點數型別:float32 和 float64。這兩種浮點數遵循 IEEE754 標準:

  • float32 的最大範圍約為 3.4e38,你可以使用常數 math.MaxFloat32 來表示。
  • float64 的最大範圍約為 1.8e308,你可以使用常數 math.MaxFloat64 來表示。

打印浮點數時,可以使用 fmt 套件的 %f 來控制小數點位數:

var pi = math.Pi
fmt.Printf("預設小數點後6位:%f\n", pi)
fmt.Printf("小數點後保留2位:%.2f\n", pi)

浮點數精度問題

幾乎所有程式語言都會有精度損失的問題,這在計算機科學中是常見的問題。例如:

d := 1129.6
fmt.Println(d * 100) // 輸出 112959.99999999

如果需要高精度計算,可以考慮使用第三方套件來解決,例如:

shopspring/decimal: 在 Go 中實現的任意精度固定小數點數字 (github.com)

布林型別

定義布林型別很簡單:

var fl = false
if fl {
fmt.Println("true")
} else {
fmt.Println("false")
}

字串型別

在 Go 語言中,字串是原生資料型別,與其他型別一樣使用。Go 語言內部使用 UTF-8 編碼來表示字串。你可以在雙引號(”)中放置內容來表示字串,甚至可以在程式碼中添加非 ASCII 字元。

s1 := "hello"
s2 := "你好"

如果想要定義多行字串,可以使用反引號:

var str = `這是第一行
這是第二行`
fmt.Println(str)

字串還支援許多常見的操作,例如計算長度、串接、分割、判斷是否包含、前綴和後綴判斷、尋找子字串位置等。

字串常見操作

  • len(str):計算長度
  • + 或 fmt.Sprintf:串接字串
  • strings.Split:分割字串
  • strings.Contains:判斷是否包含
  • strings.HasPrefix,strings.HasSuffix:前綴/後綴判斷
  • strings.Index(),strings.LastIndex():子字串出現的位置
  • strings.Join():合併操作
  • strings.Index():判斷在字串中的位置

byte 和 rune 型別

構成每個字串的元素稱為「字符」,可以通過遍歷字串元素獲取字符。字符使用單引號 ’’ 包裹起來。

Go語言中的字符有以下兩種型別:

  • uint8型別:也叫byte型,代表了ACII碼的一個字符
  • rune型別:代表一個UTF-8字符

當需要處理中文、日文或其他複合字符時,就需要使用rune型別。rune型別實際上是一個int32。

Go使用了特殊的rune型別來處理Unicode,讓基於Unicode的文本處理更加方便。也可以使用byte型進行默認字串處理,性能和擴展性都得到考慮。

需要注意的是,在Go語言中,一個漢字佔用3個位元組(UTF-8編碼),一個字母佔用1個位元組。

package main
import "fmt"

func main() {
var a byte = 'a'

fmt.Println(a) // 輸出ASCII碼值,直接輸出byte(字符)時,顯示字符對應的碼值
fmt.Printf("%c", a) // 輸出字符 'a'
s := "你好 golang"
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c)\t", s[i], s[i]) // 使用 len 循環輸出 ASCII 碼
}

for index, v := range s {
fmt.Println(index, v) // 通過rune打印UTF-8字符
}
}

修改字串

要修改字串,需要先將其轉換成[]rune 或 []byte型別,完成後再轉換成string型別。無論哪種轉換都會重新分配內存,並複製位元組陣列。

轉換為[]byte型別

s1 := "big"
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1))

轉換為rune型別

s2 := "你好golang"
byteS2 := []rune(s2)
byteS2[0] = '我'
fmt.Println(string(byteS2))

基本型別轉換

數值型別轉換

// 整數和浮點數之間的轉換
var aa int8 = 20
var bb int16 = 40
fmt.Println(int16(aa) + bb)

// 建議從整數轉換為浮點數
var cc int8 = 20
var dd float32 = 40
fmt.Println(float32(cc) + dd)

建議從低位轉換為高位,這樣可以避免丟失精度。

轉換為字串型別

轉換為字串型別有兩種方法,一是使用 fmt.Sprintf(),二是使用 strconv 套件的函式。

使用 fmt.Sprintf():

// 字串型別轉換
var i int = 20
var f float64 = 12.456
var t bool = true
var b byte = 'a'
str1 := fmt.Sprintf("%d", i)
fmt.Printf("類型:%v-%T \n", str1, str1)
str2 := fmt.Sprintf("%f", f)
fmt.Printf("類型:%v-%T \n", str2, str2)
str3 := fmt.Sprintf("%t", t)
fmt.Printf("類型:%v-%T \n", str3, str3)
str4 := fmt.Sprintf("%c", b)
fmt.Printf("類型:%v-%T \n", str4, str4)

使用 strconv 套件的函式:

// 將int型別轉換為str型別
var num1 int64 = 20
s1 := strconv.FormatInt(num1, 10)
fmt.Printf("轉換:%v - %T", s1, s1)

// 將float型別轉換為string型別
var num2 float64 = 3.1415926
/* 參數1:要轉換的值 參數2:格式化型別 'f'表示float,'b'表示二進制,'e'表示十進制 參數3:表示保留的小數點,-1表示不格式化小數點 參數4:格式化的型別,傳入64位或32位 */
s2 := strconv.FormatFloat(num2, 'f', -1, 64)
fmt.Printf("轉換:%v-%T", s2, s2)

字串轉換為數值型別

將字串轉換為數值型別也很容易,使用 strconv 套件即可:

str := "10"
// 第一個參數:需要轉換的數值,第二個參數:進制,參數三:32位或64位
num,_ = strconv.ParseInt(str, 10, 64)

// 轉換為float型別
str2 := "3.141592654"
num,_ = strconv.ParseFloat(str2, 10)

記得檢查轉換錯誤(例如無效的字串格式),這就是 _ 的作用。

📚Reference

17會員
78內容數
golang
留言0
查看全部
發表第一個留言支持創作者!