目錄
1. 基本數據類型
1.1 布爾類型
1.2 整數類型
1.3 浮點數類型
1.4 復數類型
1.5 字符類型
1.6 字符串類型
2. 類型轉換
2.1 基本數據類型 → string
2.2?string → 基本數據類型
3. 常量
1. 基本數據類型
1.1 布爾類型
Go中的布爾類型取值為true或false,占用1字節大小。如下:
package mainimport ("fmt"
)func main() {// 布爾類型var flag bool = truefmt.Printf("flag value = %t\n", flag) // flag value = truefmt.Printf("flag type = %T\n", flag) // flag type = bool
}
說明一下:
- 布爾類型的默認值為false,變量聲明后,如果沒有給變量賦值,則保留默認值。
- Go中在格式化字符串時,%t表示按布爾值true或false進行格式化。
- 關系運算符和邏輯運算符都會產生布爾類型的值,條件語句和循環語句的條件部分也都是布爾類型的值。
1.2 整數類型
類型 | 有無符號 | 占用存儲空間 |
---|---|---|
int8 | 有 | 1字節 |
int16 | 有 | 2字節 |
int32 | 有 | 4字節 |
int64 | 有 | 8字節 |
uint8 | 無 | 1字節 |
uint16 | 無 | 2字節 |
uint32 | 無 | 4字節 |
uint64 | 無 | 8字節 |
int | 有 | 32位系統占用4字節,64位系統占用8字節 |
uint | 無 | 32位系統占用4字節,64位系統占用8字節 |
rune | 有 | 等價于int32,占用4字節 |
byte | 無 | 等價于uint8,占用1字節 |
1. 整數類型
// 如果不指明類型,整數變量默認是 intvar a = 10 // 默認 int 類型// 默認值:整數類型默認值為 0var b
int fmt.Println(b) // 輸出 0
2. unsafe.Sizeof
// Sizeof 是 unsafe 包中的函數,用于獲取數據所占用的字節數import "unsafe"
var a int64
fmt.Println(unsafe.Sizeof(a)) // 輸出 8(字節)
3. 格式化字符串
// %d → 十進制整數// %T → 顯示變量的類型a := 10
fmt.Printf("值: %d, 類型: %T\n", a, a) // 輸出:值: 10, 類型: int
4. 字符類型
// rune → 表示 Unicode 字符(實際是 int32)
// byte → 表示 ASCII 字符(實際是 uint8)var ch rune = '你'
var b byte = 'A'
fmt.Println(ch, b) // 20320 65
1.3 浮點數類型
Go中的浮點數類型如下:
類型 | 占用存儲空間 | 表示范圍 |
---|---|---|
float32 | 4 字節,單精度 | ?3.403 × 103? ~ 3.403 × 103? |
float64 | 8 字節,雙精度 | ?1.798 × 103?? ~ 1.798 × 103?? |
1. 變量聲明與默認類型
// 如果不指明類型,浮點數變量默認是 float64var a = 3.14 // 默認 float64// 默認值:浮點數變量未賦值時,默認值為 0
var b float64
fmt.Println(b) // 0
2. 浮點數存儲結構:浮點數在計算機中分為三部分:符號位(sign bit)、指數位(exponent)、尾數位/小數位(mantissa/fraction)
3. 格式化輸出
// %f → 按浮點數格式輸出
// %.2f → 保留兩位小數a := 3.14159
fmt.Printf("%f\n", a) // 輸出 3.141590
fmt.Printf("%.2f\n", a) // 輸出 3.14
1.4 復數類型
Go中的復數類型如下:
類型 | 占用存儲空間 | 表數范圍 |
---|---|---|
complex64 | 8字節 | 實部和虛部的范圍與float32類型相同 |
complex128 | 16字節 | 實部和虛部的范圍與float64類型相同 |
1.5 字符類型
Go中沒有專門的字符類型,一般使用整數類型中的byte來存儲單個字符。
package mainimport ("fmt"
)func main() {var a byte = 'A'fmt.Printf("類型:%T, 值:%c\n", a, a) // 類型:uint8, 值:Avar b rune = '牛'fmt.Printf("類型:%T, 值:%c\n", b, b) // 類型:int32, 值:牛
}
1.6 字符串類型
字符串就是一串固定長度的字符連接起來的字符序列,Go中的string是由單個字節連接起來的。string類型底層包含兩個字段,一個字段是字符串指針,該指針指向對應的字符串,另一個字段記錄著字符串的長度。
package mainimport ("fmt"
)func main() {var a string = "Hello World"fmt.Printf("類型:%T, 值:%s\n", a, a) // 類型:string, 值:Hello World// 1. string元素的訪問// 注意:Go中的字符串是不可變的,因此在訪問string元素時無法將元素修改為其他值。for i := 0; i < len(a); i++ {fmt.Printf("%c", a[i]) // Hello World}fmt.Println()// 2. 字符串的表示形式// 雙引號表示:系統會識別字符串中的轉義字符。// 反引號表示:系統不會識別字符串中的轉義字符,可以實現防止攻擊、輸出源代碼等效果。var s1 string = "Hello\nWorld"var s2 string = `Hello\nWorld`fmt.Println(s1) // Hello(換行)Worldfmt.Println(s2) // Hello\nWorld// 3. 字符串拼接var s = "hello" + "world"fmt.Println(s) // helloworld
}
2. 類型轉換
2.1 基本數據類型 → string
1. 使用 fmt.Sprintf:
fmt.Sprintf
可以按照格式化規則把任意類型轉換成字符串:
package mainimport "fmt"func main() {var a int = 100var b float64 = 3.1415926var c bool = truevar a1 string = fmt.Sprintf("%d", a)var b1 string = fmt.Sprintf("%.2f", b)var c1 string = fmt.Sprintf("%t", c)fmt.Println(a1, b1, c1) // 100 3.14 true
}
2.?strconv
包也能做類型轉字符串,更高效
- FormatInt函數:將int64類型的變量轉換為string類型。
- FormatFloat函數:將float64類型的變量轉換為string類型。
- FormatBool函數:將bool類型的變量轉換為string類型。
- FormatUint函數:將uint64類型的變量轉換為string類型。
- Itoa函數:將int類型變量轉換為string類型,Itoa函數底層實際就是調用FormatInt函數實現的,在內部設置了按十進制進行轉換。
package mainimport ("fmt""strconv"
)func main() {var a int = 100var b float64 = 3.1415926var c bool = truevar a1 string = strconv.FormatInt(int64(a), 10)var b1 string = strconv.FormatFloat(b, 'f', -1, 64)var c1 string = strconv.FormatBool(c)fmt.Println(a1, b1, c1)
}
-
如果是 簡單數值轉 string → 用
strconv
(性能好) -
如果需要 格式化輸出 → 用
fmt.Sprintf
(靈活)
2.2?string → 基本數據類型
- ParseInt函數:將string類型變量轉換為int64類型。
- ParseFloat函數:將string類型變量轉換為float64類型。
- ParseBool函數:將string類型變量轉換為bool類型。
- ParseUint函數:將string類型變量轉換為uint64類型。
- Atoi函數:將string類型變量轉換為int類型,?Atoi函數底層實際就是調用ParseInt函數實現的,在內部設置了按十進制進行轉換。
package mainimport ("fmt""strconv"
)func main() {// 1. 字符串 → 有符號整數// "123" → 要轉換的字符串// 10 → 原字符串的進制(2~36)// 64 → 返回值的位數(64 表示 int64)a, err1 := strconv.ParseInt("123", 10, 64)fmt.Println(a, err1)a1, err := strconv.Atoi("520")fmt.Println(a1, err)// 2. 字符串 → 無符號整數// "255" → 需轉換的字符串// 16 → 原字符串進制(這里按十六進制解析)// 64 → 返回 uint64u, err2 := strconv.ParseUint("255", 16, 64)fmt.Println(u, err2)// 3. 字符串 → 浮點數// "3.14159" → 要解析的字符串// 64 → 返回 float64;如果是 32 則返回 float32f, err := strconv.ParseFloat("3.14159", 64)fmt.Println(f, err)// 4. 字符串 → 布爾值// 支持的字符串(不區分大小寫):// "1", "t", "T", "true", "TRUE", "True"// "0", "f", "F", "false", "FALSE", "False"b, err := strconv.ParseBool("t")fmt.Println(b, err)
}
3. 常量
-
編譯期確定 → 不能在運行時通過計算或函數結果賦值給常量。
-
不可修改 → 一旦定義,值就不能改變。
-
類型推導 → 可不寫類型,編譯器會根據值推導。
-
可以是無類型常量 → 沒有明確類型的常量,可以在需要時自動轉換:
const x = 5 // 無類型常量
var y float64 = x // 自動轉換為 float64
1. 定義方式
const 常量名 [類型] = 值const Pi = 3.14159 // 類型推導
const Version string = "1.0.0" // 顯式聲明類型
-
類型可以省略,編譯器會根據值自動推導類型。
-
常量的值必須在編譯期就能確定。
2. 多個常量一起聲明
const ( A = 1 BC = 3 DE
)fmt.Println(A, B, C, D , E) // 1 1 3 3 3
3. iota 枚舉常量
iota
是一個常量計數器,從 0
開始,每新增一行常量聲明,iota
自動加 1。
常用于定義枚舉值:
const (Sunday = iota // 0Monday // 1Tuesday // 2
)
fmt.Println(Sunday, Monday, Tuesday) // 0 1 2// 也可以用在位運算:
const (_ = iota // 忽略 0KB = 1 << (10 * iota) // 1 << 10 = 1024MB // 1 << 20 = 1048576GB // 1 << 30
)