Bài học theo mô-đun (2/5)
Chuyển đổi loại và giá trị bằng 0
Trong Go, mọi biến được khai báo mà không có giá trị rõ ràng sẽ nhận được một
giá trị 0: "giá trị trung tính" của loại của nó. Đó là một sự khác biệt lớn
từ JavaScript, trong đó let x; tạo ra undefined hoặc C, nơi bạn kết thúc
với bộ nhớ rác. Không undefined, không UB: chỉ bằng không.
Bảng giá trị 0
| Danh mục | Loại | Giá trị 0 |
|---|---|---|
| Số | int, int64, float32, float64, uint, ... | 0 |
| Boolean | bool | false |
| Chuỗi | string | "" (chuỗi trống) |
| Con trỏ | *T | nil |
| Lát / Bản đồ / Kênh | []T, map[K]V, chan T | nil |
| Chức năng/Giao diện | func(...), interface{...} | nil |
| Cấu trúc | T struct{...} | tất cả các trường ở giá trị 0 |
var i int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nil
var nums []int // nil (NB: una slice nil ha len 0 e si può iterare!)Chuyển đổi LUÔN rõ ràng
Không giống như C, Python hay JS, Go không tự động thăng cấp một
gõ số sang kiểu khác: bạn phải viết type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Điều này đúng ngay cả với các loại "tương thích" như int và int64:
chuyển đổi rõ ràng luôn được yêu cầu.
var a int = 10
var b int64 = int64(a) // obbligatorioChuyển đổi giữa các số: coi chừng việc cắt bớt
Đi từ float64 tới int cắt ngắn về 0, không
tròn:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Chuyển đổi chuỗi ↔ số
string(65) KHÔNG cung cấp "65": nó cung cấp "A" (chữ rune có mã
điểm 65). Đối với chuỗi → số và ngược lại, bạn cần strconv
gói:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilChúng tôi sẽ trình bày sâu hơn về mô-đun Stdlib.
Đến lượt bạn
Khai báo một biến đếm kiểu int mà không khởi tạo nó và in nó. Dự kiến: 0.
Hiển thị gợi ý
Nếu không có bộ khởi tạo, biến sẽ nhận giá trị 0 của loại.
Giải pháp khả dụng sau 3 lần thử
Cho số nguyên n=10, chuyển n thành float64 và chia cho 4. In kết quả (dự kiến là 2,5).
Hiển thị gợi ý
Nếu không có chuyển đổi rõ ràng, `n / 4` là phép chia số nguyên cho 2.
Giải pháp khả dụng sau 3 lần thử
Mã này in gì?
f := 3.7
fmt.Println(int(f))Tóm tắt lại
- Mọi loại đều có giá trị 0 nhất quán: không
undefined, không UB. - Slice/map/chan/func/interface/pointer có giá trị bằng 0
nil. - Chuyển đổi số luôn rõ ràng với
type(value). int(float)cắt ngắn về 0; để làm tròn việc sử dụngmath.Round.- Đối với chuỗi ↔ số, hãy sử dụng gói
strconv(KHÔNG phải truyền trực tiếp).