Menu
CoddyTech

Hàm khởi tạo

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 10 trên 107.

Go không có hàm khởi tạo như các ngôn ngữ khác. Thay vào đó, theo quy ước, người ta tạo một hàm có tên NewTypeName trả về một struct đã được khởi tạo, thường là một con trỏ.

Hàm khởi tạo cơ bản

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

Hàm khởi tạo với các giá trị mặc định

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // Giá trị mặc định
        Timeout: 30,      // Giá trị mặc định
    }
}

Hàm khởi tạo có kiểm tra tính hợp lệ

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

Sử dụng hàm khởi tạo

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // Unknown
    fmt.Println(p2.Age)  // 0
}

Các hàm khởi tạo trả về một con trỏ (*StructName) bằng cách dùng &. Cách này tránh sao chép struct và cho phép các phương thức có bộ nhận con trỏ hoạt động trực tiếp. Hãy đặt phần xác thực và các giá trị mặc định bên trong hàm khởi tạo.

challenge icon

Thử thách

Trung bình

Tạo hàm khởi tạo NewBankAccount cho cấu trúc BankAccount có kiểm tra hợp lệ:

  • Nhận name (chuỗi) và balance (float64) làm tham số
  • Nếu name trống, đặt giá trị mặc định là "Unnamed"
  • Nếu balance là số âm, đặt giá trị mặc định là 0
  • Luôn đặt Owner thành "Default Owner"
  • Trả về con trỏ đến cấu trúc mới

Tự làm thử

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Go online