类/对象的声明
有缺陷的声明类/对象
例如:
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为李四,再打印观察结果。
运行结果:
可以看到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的方法改为绑定类的指针
运行结果:
可以看到当前的类方法可以成功修改实例化对象的属性。
方法名/结构体名首字母大小写的区别
类名、属性名(结构体名)、方法名首字母大写表示对外(其他包)可以访问,否则只能够在本包内访问。
方法名首字母大写
如果方法名首字母大写,表示的是该方法在其他包导入的时候是可以访问的
结构体名首字母大写
- 如果结构体名首字母大写,表示其他包也能够访问
如果结构体内的属性首字母大写,表示该属性是对外能够访问,否则只能够让类的内部访问
- 例如fmt.Println,Println是fmt中的一个方法,首字母大写,所以在其他包中就可以直接使用这个函数方法
此处评论已关闭