持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第40天,点击查看活动详情
一、方法和函数的区别
- 调用方式不一样 函数的调用方式: 函数名(实参列表) 方法的调用方式: 变量.方法名(实参列表)
- 对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然
- 对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以
package main
import "fmt"
type Person struct {
Name string
}
// 函数
// 对于普通函数接收者为值类型时,不能将指针类型直接传递,反之亦然
func test(p Person) {
fmt.Printf("test() p.Name = %v\n", p.Name)
}
func testPtr(p *Person) {
fmt.Printf("testPtr P.Name = %v\n", p.Name)
}
// 方法
// 接收者为值类型时,可以直接使用指针类型的变量调用方法,反之亦然
func (p Person) Print1() {
p.Name = "Aliy -- 1"
fmt.Printf("Method Print1() p.Name = %v\n", p.Name)
}
func (p Person) Print2() {
p.Name = "Aliy -- 2"
fmt.Printf("Method Print2() p.Name = %v\n", p.Name)
}
// 方法vs函数
func main() {
// 函数
person := Person{"aliy"}
// test() p.Name = aliy
test(person)
// testPtr P.Name = aliy
testPtr(&person)
// Method Print() p.Name = aliy
person.Print1()
// 查看main中的
// Main() p.name =aliy
fmt.Printf("Main() p.name =%v\n", person.Name)
// Method Print() p.Name = aliy
(&person).Print1()
}
二、面向对象编程应用实例
2.1 步骤
- 声明(定义)结构体,确定结构体名
- 编写结构体的字段
- 编写结构体方法
2.2 学生案例
- 编写一个Student结构体,包含name,gender,age,id,score字段,类型分别为 string,string,int,int,float64
- 结构体中声明一个say方法,返回string类型,方法返回信息中包含所有字段值
- 在main方法中,创建Student结构体实例(变量),访问say方法,并将调用结果打印输出
package main
import "fmt"
/*
1. 编写一个Student结构体,包含name,gender,age,id,score字段,类型分别为 string,string,int,int,float64
2. 结构体中声明一个say方法,返回string类型,方法返回信息中包含所有字段值
3. 在main方法中,创建Student结构体实例(变量),访问say方法,并将调用结果打印输出
*/
type Student struct {
name string
gender string
age int
id int
score float64
}
func (student *Student) say() string {
infoStr := fmt.Sprintf("student的信息如下 name=[%v],gender=[%v],age=[%v],id=[%v],score=[%v]",
student.name, student.gender, student.age, student.id, student.score)
return infoStr
}
func main() {
// 创建一个Student 实例
stu := Student{"Alibbabab", "male", 22, 1000011, 99.99}
// student的信息如下 name=[Alibbabab],gender=[male],age=[22],id=[1000011],score=[99.99]
fmt.Printf(stu.say())
}
2.3 盒子案例
- 编程创建一个Box结构体, 在其中声明三个字段表示一个立方体的长、宽和高,长宽高要从终端获取
- 声明一个方法获取立方体的体积。
- 创建一个Box结构体变量,打印给定尺寸的立方体的体积。
package main
import "fmt"
/*
1. 编程创建一个Box结构体, 在其中声明三个字段表示一个立方体的长、宽和高,长宽高要从终端获取
2. 声明一个方法获取立方体的体积。
3. 创建一个Box结构体变量,打印给定尺寸的立方体的体积。
*/
type Box struct {
length float64
width float64
high float64
}
func (box *Box) volomn() float64 {
return box.length * box.width * box.high
}
func main() {
// 声明实例
b1 := Box{}
fmt.Print("请输入要计算立方体的长宽高(空格隔开)")
fmt.Scanf("%v %v %v", &b1.length, &b1.width, &b1.high)
fmt.Printf("立方体的体积 = %v", b1.volomn())
}
2.4 景区门票案例
- 一个景区根据游人的年龄收取不同价格的门票,比如年龄大于18,收费20元,其它情况门票免费.
- 请编写Visitor结构体,根据年龄段决定能够购买的门票价格并输出
package main
import "fmt"
/*
1. 一个景区根据游人的年龄收取不同价格的门票,比如年龄大于18,收费20元,其它情况门票免费.
2. 请编写Visitor结构体,根据年龄段决定能够购买的门票价格并输出
*/
type Visitor struct {
Name string
Age int
}
func (vistor *Visitor) ticket() {
if vistor.Age > 18 {
fmt.Printf("%v 的年龄为 %v ,门票费为 20 元\n", vistor.Name, vistor.Age)
} else {
fmt.Printf("%v年龄为 %v ,低于18,免费\n", vistor.Name, vistor.Age)
}
}
func main() {
v1 := Visitor{}
for {
fmt.Print("请输入您的姓名,退出请输入Q: ")
fmt.Scanln(&v1.Name)
if v1.Name == "Q" {
fmt.Println("退出程序......")
break
}
fmt.Print("请输入您的年龄: ")
fmt.Scanln(&v1.Age)
v1.ticket()
}
}