Chuyển đến nội dung chính
Mô-đun 5 · Bài học 1 trong tổng số 521/50 trong khóa học~12 min
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

Go
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

Go
// 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 struct

Truy cập trường

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

Go
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

Go
// 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):

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

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

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.

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

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

In giá trị của trường Tên của p (một Người hiện có).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Truy cập trường: `p.Field`.

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m5.l1.e3
Sẵn sàng

Khả năng hiển thị của trường 'chuỗi tên' (chữ thường) từ gói khác là gì?

Go
// in package other
type X struct {
    name string
}
Tùy chọn trả lời

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.Field trê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 đồ.