构造函数
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 10 课,共 107 课。
Go 没有像其他语言那样的构造函数。相反,惯例是创建一个名为 NewTypeName 的函数,返回一个已初始化的结构体,通常返回指针。
基本构造函数
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}带默认值的构造函数
type Config struct {
Host string
Port int
Timeout int
}
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // 默认值
Timeout: 30, // 默认值
}
}带验证的构造函数
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}使用构造函数
func main() {
p1 := NewPerson("Alice", 25)
fmt.Println(p1.Name) // Alice
p2 := NewPerson("", -5)
fmt.Println(p2.Name) // Unknown
fmt.Println(p2.Age) // 0
}构造函数使用 & 返回指针(*StructName)。这样可以避免复制结构体,并让指针接收者的方法直接使用它。验证和默认值应放在构造函数中。
挑战
中等为 BankAccount 结构体创建一个带验证的构造函数 NewBankAccount:
- 接收
name(字符串)和balance(float64)作为参数 - 如果
name为空,则默认设为"Unnamed" - 如果
balance为负数,则默认设为0 - 始终将
Owner设为"Default Owner" - 返回指向新结构体的指针
亲手试试
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)
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器