嗯,要警惕负能量,要热爱学习,怎么能一谈到学习就是负能量的话,要给自己打鸡血
方法是作用在指定数据类型上,与对应类型是绑定关系
package main
import "fmt"
type Person struct {
Name string
}
//func (绑定的类型) 方法名(参数列表) 返回值列表
func (p Person) printName() {
//此处的p与其他语言(java)中的this有异曲同工之处
fmt.Println(p.Name)
}
//调用changeName函数的只能是Person类型的变量,且对应的(p Person)中的p只是调用
//该函数变量的副本(值拷贝) 与变量类型有关(值类型变量值拷贝,引用类型则为地址拷贝)
func (p Person) changeName(newName string) {
fmt.Printf("change name p %p \n", &p)
p.Name = newName
}
func (p *Person) setName(newName string) {
p.Name = newName
fmt.Printf("change name p %p \n", p)
}
type MyInt int
func (m MyInt) printVal() {
fmt.Println("myint -------- ", m)
}
func main() {
tom := Person{}
tom.printName()
fmt.Printf("main p %p \n", &tom)
tom.changeName("tom")
tom.printName()
//方法与绑定的类型密切相关,此处为Person的指针类型调用对应的方法,
//由于方法绑定的是Person类型,方法中只会是值拷贝
(&tom).changeName("tom")
tom.printName()
//setName绑定的是Person的指针类型,此时是地址拷贝
(&tom).setName("tom")
tom.printName()
//go在编译时对调用指针类型方法进行了优化
//(&tom)可以直接简写成tom
tom.setName("big-tom")
tom.printName()
//方法作用在指定的数据类型上,任何自定义类型都可以有方法
var m MyInt = 101
m.printVal()
}
至此不难看出,struct是golang的面向对象的体现
package main
import (
"fmt"
"math/rand"
)
type Visitor struct {
No int
Name string
Age byte
}
func (v Visitor) SayHi() {
fmt.Printf("%v 欢迎光临! \n", v.Name)
}
//直接定义成对应类型的指针方法更便于操作
func (v *Visitor) LineUp() {
if v.Age > 60 {
fmt.Println("老年人优先,无需排队")
v.No = -1
} else {
v.No = rand.Intn(1000)
fmt.Printf("%v当前排%v号\n", v.Name, v.Age)
}
}
func main() {
tom := Visitor{
Name: "tom",
Age: 80,
}
tom.SayHi()
tom.LineUp()
//直接获取对象的指针
dean := &Visitor{
Name: "dean",s
Age: 15,
}
dean.SayHi()
dean.LineUp()
}
struct定义属性和绑定方法体现的是面向对象的封装特性,本打算把继承和多态也放到一起的,看了看还是再另起一篇吧。
这一篇内容这么少竟然是分两次写的……