类/对象的声明

Go语言中的类,相当于结构体中绑定方法。

有缺陷的声明类/对象

例如:

package main

import "fmt"

type Hero struct {  //首先声明一个结构体
    Name string
    Age int
    Level int
}

func (this Hero) Show() {
    fmt.Println("Name = ",this.Name)
    fmt.Println("Age = ",this.Age)
    fmt.Println("Level = ",this.Level)
}

func (this Hero) GetName() { // this表示当前的对象,getname表示类的方法名
    fmt.Println("Nmae = ",this.Name)
}

func (this Hero) SetName(newName string) { // 设置属性
    // this是调用该方法的对象的一个拷贝(副本)
    this.Name = newName
}

func main() {
    //实例化一个对象
    hero := Hero{Name: "张三", Age:23, Level:1}
    hero.Show()
    hero.SetName("李四")
    hero.Show()
}
  • 第11行括号中填的是绑定的结构体的名字即Hero,this表示当前的对象,Show表示方法名
  • 第17行修改Hero中的Name属性
  • 26-32行首先实例化一个对象,Name为张三,接着使用SetName方法修改Name为李四,再打印观察结果。

运行结果:
image.png
可以看到SetName方法未能成功修改Hero对象的Name属性,原因是方法中的this只是当前对象的副本(拷贝),因此和hero对象的内存地址不是一样的,所以无法通过对象方法来修改实例化对象的属性。

正确的类/对象的声明

为了解决实例化对象的方法无法修改对象的属性的问题,方法绑定类时需要传递的是类的指针,这样方法才能正确修改实例化对象的属性。

例如:

package main

import "fmt"

type Hero struct {  //首先声明一个结构体
    Name string
    Age int
    Level int
}

func (this *Hero) Show() {
    fmt.Println("Name = ",this.Name)
    fmt.Println("Age = ",this.Age)
    fmt.Println("Level = ",this.Level)
}

func (this *Hero) GetName() { // this表示当前的对象,getname表示类的方法名
    fmt.Println("Nmae = ",this.Name)
}

func (this *Hero) SetName(newName string) { // 设置属性
    // this是调用该方法的对象的一个拷贝(副本)
    this.Name = newName
}

func main() {
    //实例化一个对象
    hero := Hero{Name: "张三", Age:23, Level:1}
    hero.Show()
    hero.SetName("李四")
    hero.Show()
}
  • 第11、17、21的方法改为绑定类的指针

运行结果:
image.png
可以看到当前的类方法可以成功修改实例化对象的属性。

方法名/结构体名首字母大小写的区别

类名、属性名(结构体名)、方法名首字母大写表示对外(其他包)可以访问,否则只能够在本包内访问。

方法名首字母大写

如果方法名首字母大写,表示的是该方法在其他包导入的时候是可以访问的

结构体名首字母大写

  • 如果结构体名首字母大写,表示其他包也能够访问
  • 如果结构体内的属性首字母大写,表示该属性是对外能够访问,否则只能够让类的内部访问

    • 例如fmt.Println,Println是fmt中的一个方法,首字母大写,所以在其他包中就可以直接使用这个函数方法
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏