对象
- 结构体就是对象
- 显示声明对象的方法
注意⚠️指针接收者和值接收者的区别:指针接收者可以修改接收者的值,而值接收者不能修改接收者的值。
type MyStruct struct {
Field int
}
- 值接收者:当你使用值接收者定义方法时,Go会在每次调用这个方法时复制接收者。在方法内部,你可以修改接收者的字段,但这不会影响原始的接收者。因为你修改的是接收者的一个副本。
func (m MyStruct) SetValue(val int) {
m.Field = val
}
func main() {
s := MyStruct{}
s.SetValue(5)
fmt.Println(s.Field) // 输出 0,因为SetValue方法修改的是s的副本,不会影响s本身
}
- 指针接收者:当你使用指针接收者定义方法时,Go不会复制接收者,而是传递接收者的地址。因此,你可以在方法内部修改接收者的值。
func (m *MyStruct) SetValue(val int) {
m.Field = val
}
func main() {
s := &MyStruct{}
s.SetValue(5)
fmt.Println(s.Field) // 输出 5,因为SetValue方法修改的是s的值
}
三大特性
- 小写就是封装(小写同一包;大写任意包)
// 定义一个结构体
type person struct {
name string
Age int
}
- 组合
type Animal struct {
Name string
}
type Bird struct {
Animal // 嵌入Animal结构体
CanFly bool
}
func main() {
b := Bird{
Animal: Animal{Name: "Sparrow"},
CanFly: true,
}
fmt.Println(b.Name)
fmt.Println(b.CanFly)
}
- 通过接口实现多态
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
type Rectangle struct {
Width, Height float64
}
// Circle 实现了 Shape 接口
func (c *Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// Rectangle 实现了 Shape 接口
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func printArea(s Shape) {
fmt.Println(s.Area())
}
func main() {
c := &Circle{Radius: 5} //💡Circle没有实现Shape接口,而是Circle的指针实现了Shape接口
r := Rectangle{Width: 3, Height: 4}
printArea(c)
printArea(r)
}
设计模式五大原则
举例
-
一个方法的动作应该是单一的!
-
不同对象(结构体)只是共有的同类方法 ===> 提取方法为接口!
-
不同对象(结构体)拥有共同属性(或还有共同方法)===> 提取为父类结构体!