Bài học theo mô-đun (1/5)
Định nghĩa và sử dụng cấu trúc
struct nhóm các trường được đặt tên thành một loại duy nhất. Đó là cách của Go
xây dựng các "đối tượng" - theo nghĩa đen và trực tiếp hơn các lớp, với
không có sự kế thừa và không có hàm tạo tích hợp.
Tuyên ngôn
type Person struct {
Name string
Age int
}type giới thiệu loại được đặt tên mới. Các trường được viết một cho mỗi
dòng, name type. Các trường liên tiếp cùng loại có thể chia sẻ
khai báo: X, Y int.
Sáng tạo
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}
// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}
// zero value: every field at its zero value
var r Person // r = {Name: "", Age: 0}
// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person) // *Person to a zero-value structTruy cập trường
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)
p.Age = 37 // mutation (if p is a variable)Trên một con trỏ, ptr.Name hoạt động trực tiếp: Go thực hiện
sự hủy hoại ngầm. Không -> như trong C.
Khả năng hiển thị: quy tắc viết hoa
Các trường có chữ đầu tiên viết hoa được xuất (hiển thị từ các trường khác gói); chữ thường = riêng tư cho gói hiện tại.
type User struct {
Name string // exported
salt []byte // private to the package
}Quy tắc tương tự áp dụng cho mọi mã định danh trong Go: loại, hàm, biến, trường.
Cấu trúc ẩn danh và lồng nhau
// anonymous (handy for ad-hoc data)
config := struct {
Host string
Port int
}{Host: "localhost", Port: 8080}
// nested
type Address struct {
Street string
City string
}
type Customer struct {
Name string
Address Address
}Khả năng so sánh
Hai cấu trúc có thể so sánh với == nếu TẤT CẢ các trường của chúng là
có thể so sánh (không có lát/bản đồ/funcs bên trong):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueĐiều này cũng cho phép bạn sử dụng chúng làm khóa bản đồ.
Hãy thử nó
Xác định loại Người với chuỗi Tên và Tuổi int, sau đó khởi tạo nó dưới dạng {Name: 'Ada', Age: 36} trong main.
Hiển thị gợi ý
Cú pháp: `type Tên struct { Loại trường; ... }`.
Giải pháp khả dụng sau 3 lần thử
In giá trị của trường Tên của p (một Người hiện có).
Hiển thị gợi ý
Truy cập trường: `p.Field`.
Giải pháp khả dụng sau 3 lần thử
Khả năng hiển thị của trường 'chuỗi tên' (chữ thường) từ gói khác là gì?
// in package other
type X struct {
name string
}Tóm tắt lại
type Name struct { ... }: loại được đặt tên mới với các trường được đặt tên.- Cấu trúc:
T{Field: value, ...}(được khuyến nghị) hoặc vị trí. - Giá trị 0: mọi trường ở loại của nó đều bằng 0.
&T{...}vànew(T)cho một con trỏ; vô hiệu hóa ngầm định (p.Fieldtrên*T).- Chữ hoa = đã xuất; chữ thường = riêng tư cho gói.
- Cấu trúc có thể so sánh được với
==nếu tất cả các trường đều như vậy; có thể sử dụng làm phím bản đồ.