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())
}