Chuyển đến nội dung chính
Mô-đun 1 · Bài học 2 trong tổng số 52/50 trong khóa học~10 min
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ụcLoạiGiá trị 0
Sốint, int64, float32, float64, uint, ...0
Booleanboolfalse
Chuỗistring"" (chuỗi trống)
Con trỏ*Tnil
Lát / Bản đồ / Kênh[]T, map[K]V, chan Tnil
Chức năng/Giao diệnfunc(...), interface{...}nil
Cấu trúcT struct{...}tất cả các trường ở giá trị 0
Go
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).

Go
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.

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

Chuyể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:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

Chuyể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:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

Chúng tôi sẽ trình bày sâu hơn về mô-đun Stdlib.

Đến lượt bạn

tập thể dục#go.m1.l2.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#go.m1.l2.e2
Nỗ lực: 0Đang tải…

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).

Đang tải trình chỉnh sửa…
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ử

Quiz#go.m1.l2.e3
Sẵn sàng

Mã này in gì?

Go
f := 3.7
fmt.Println(int(f))
Tùy chọn trả lời

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ụng math.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).