1.面向对象编程应用实例
1)声明(定义)结构体,确定结构体名
2)编写结构体的字段
3)编写结构体的方法
2.实例
2.1
1)编写一个Box结构体,在其中声明三个字段表示一个立方体的长、宽和高,长宽高要从终端获取
2)声明一个方法获取立方体的体积
3)创建一个Box结构体变量,打印给定尺寸的立方体的体积
type Box struct {
length float64
weight float64
height float64
}
func (box Box) volume() {
vo := box.length * box.weight * box.height
fmt.Printf("长方体的长为%v,宽为%v,高为%v,体积为%v\n", box.length, box.weight, box.height, vo)
}
func main() {
var box Box
fmt.Println("请输入立方体的长,宽,高")
fmt.Scanf("%v,%v,%v", &box.length, &box.weight, &box.height)
box.volume()
}
2.2输出去公园的定价,大于18岁收费,小于18岁不收费
type Person struct {
Name string
Age int
}
func (person Person) Visitor() {
fei := 0
if person.Age > 18 {
fei = 20
} else {
fei = 0
}
fmt.Printf("姓名为:%v,年龄为:%v,价格为:%v\n", person.Name, person.Age, fei)
}
func main() {
//var person Person
//person.Name = "李飞"
//person.Age = 20
person := Person{"李飞", 16}
person.Visitor()
}
3.工厂模式
golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题
使用场景,main包中要使用某个包中的结构体,但是这个结构体的名字是小写的不能被外部使用,此时要使用工厂模式。使用工厂模式可以实现跨包创建结构体实例
model.go
package model
type student struct {
Name string
Age int
}
//因为student结构体首字母是小写的,因此只能在model使用
//用工厂模式来解决
func NewStudent(n string, a int) *student {
return &student{
Name: n,
Age: a,
}
}
main.go
package main
import (
"fmt"
"gotest1/src/test/test45/model"
)
func main() {
var stu = model.NewStudent("张三", 24)
//student结构体首字母小写,可以通过工厂模式来解决
fmt.Println(*stu)
fmt.Printf("name:%v,age:%v\n", stu.Name, stu.Age)
}
如果结构体字段是首字母是小写字母,则应该只能在model包中使用,若要在main包中使用,则可以提供一个绑定了student结构体的方法GetAge()来返回这个字段,因为方法的首字母为大写所以可以在main中使用。
model.go
package model
type student struct {
Name string
age int
}
//因为student结构体首字母是小写的,因此只能在model使用
//用工厂模式来解决
func NewStudent(n string, a int) *student {
return &student{
Name: n,
age: a,
}
}
//如果stu.Age字段首字母小写,则在其他包不可以直接访问,我们可以提供一个绑定了student struct的方法
func (s *student) GetAge() int {
return s.age
}
main.go
package main
import (
"fmt"
"gotest1/src/test/test45/model"
)
func main() {
var stu = model.NewStudent("张三", 24)
//student结构体首字母小写,可以通过工厂模式来解决
fmt.Println(*stu)
fmt.Printf("name:%v,age:%v\n", stu.Name, stu.GetAge())
}