【golang面向对象编程】


一、面向对象编程三大特性-封装

1)介绍
在这里插入图片描述
2)快速入门案例

package model
type person struct{
	Name string 
	age int
	salary float64
}
//相当于构造函数
func NewStudent(name string)*person{
	return &person{
		Name:name,
	}
func (p *person)SetAge(age int){
	if age>0&&age<150{
		p.age=age
	}else{
		fmt.Println("年龄范围不对!!!")
	}
func (p *person)GetAge()int{
	return p.age
}
func (p *person)SetSal(sal float64){
	if sal>=3000&&sal<=30000{
		p.sal =sal
	}else{
		fmt.Println("薪水范围不对!!!")
	}
func (p *person)GetSal()float64{
	return p.salary
}
}
}
package main
import(
	"fmt"
	"go_code/project00/model"
)
func main(){
	var stu=model.NewStudent("tom",88.8)
	fmt.Println(*stu)
	fmt.Println("name=",stu.Name,"score=",stu.GetScore())
}

在这里插入图片描述

package model02
import(
	"fmt"
)
type account struct{
	accountNo string
	pwd string 
	balance float64
}
func NewAccount(No string,pwd string,balance float64)*account{
	if len(accountNo)<6||len(accountNo)>10{
		fmt.Println("账号的长度不对...")
		return nil
	}
	if len(pwd)!=6{
		fmt.Println("密码的长度不对...")
	}
	if balance<20{
		fmt.Println("余额数目不对...")
	}
	return &account{
		accountNo:No,
		pwd:pwd,
		balance:balance,
	}
	func (account *account) Deposite(money float64,pws string){
		if pwd != account.pwd {
			fmt.Println("你输入的密码不正确")
			return
			}
			//看看存款金额是否正确
			if money <= 0 {
			fmt.Println("你输入的金额不正确")
			return
			}
			account.balance += money
			fmt.Println("存款成功~~")
	}
	func (account *account) WithDraw(money float64, pwd string){
		if pwd != account.pwd {
			fmt.Println("你输入的密码不正确")
			return
			}
			if money <= 0 || money > account.balance {
				fmt.Println("你输入的金额不正确")
				return
				}
				account.balance -= money
				fmt.Println("取款成功~~")	
	}
	func (account *account) Query(pwd string) {
		//看下输入的密码是否正确
		if pwd != account.pwd {
		fmt.Println("你输入的密码不正确")
		return
		}
		fmt.Printf("你的账号为=%v 余额=%v \n", account.accountNo, account.balance)
		}
	}

二、面向对象编程三大特性-继承

1)语法
在这里插入图片描述
在这里插入图片描述2)快速入门

package main
import(
	"fmt"
)
type Student struct{
	Name string
	Age int
	Score int
}
func (stu *Student)ShowInfo(){
	fmt.Printf("姓名:%v 年龄:%v 成绩:%v\n",stu.Name,stu.Age,stu.Score)

}
func (stu *Student)SetScore(score int){
	stu.Score=score
}
type pupil struct{
	Student
	
}
func (p *pupil)testing(){
	fmt.Println("小学生正在考试...")
}
type Graduate struct{
	Student
}
func (g *Graduate)testing(){
	fmt.Println("大学生正在考试...")
}
func main(){
	p:=pupil{}
	p.Name="tom"
	p.Age=18
	p.testing()
	p.SetScore(70)
	p.ShowInfo()

	g:=Graduate{}
	g.Name="tom"
	g.Age=18
	g.testing()
	g.SetScore(70)
	g.ShowInfo()
}

在这里插入图片描述3)细节

  • 结构体可以使用嵌套匿名结构体所有的字段和方法
  • 匿名结构体字段访问可以简化
  • 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字
  • 如果一个 struct 嵌套了一个有名结构体,这种模式是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
  • 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值在这里插入图片描述
  • List item

三、 接口

1)为什么有接口
在这里插入图片描述
2)快速入门

package main
import(
	"fmt"
)
import()
type Usb interface{
	Start()
	Stop()
}
type Phone struct{

}
func (p Phone)Start(){
	fmt.Println("手机开始")
}
func (p Phone)Stop(){
	fmt.Println("手机结束")
}
type Camera struct{}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	usb.Stop()
}
func main(){
	computer:=Computer{}
	phone:=Phone{}
	camera:=Camera{}
	computer.Working(phone)
	computer.Working(camera)
}

在这里插入图片描述3)基本语法

  • 不包含变量
  • 接口中的方法没有方法体
  • 不需要显式的实现

4)注意细节

  • 、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
	var a Usb=phone
	a.Start()
	a.Stop()
  • 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
  • interface 类型默认是一个=指针(引用类型),如果没有对 interface 初始化就使用,那么会输出 nil
  • 空接口 interface{} 没有任何方法,所以所有类型都实现了空接口, 即我们可以把任何一个变量赋给空接口

4)实现接口 vs 继承
接口是继承的一种补充在这里插入图片描述


四、面向对象编程三大特性-多态

在这里插入图片描述

type Usb interface{
	Start()
	Stop()
}
type Phone struct{
	name string
}
func (p Phone)Start(){
	fmt.Println("电话开始")
}
func(p Phone)Stop(){
	fmt.Println("电话结束")
}
func (p Phone)Call(){
	fmt.Println("手机在打电话")
}
type Camera struct{
	name string
}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	usb.Stop()
}
func main(){
	var usbArr [3]Usb
	usbArr[0]=Phone{"vivo"}
	usbArr[1]=Phone{"小米"}
	usbArr[2]=Camera{"索尼"}
	var computer Computer

五、 类型断言

1)需求
把一个接口变量,赋值给自定义类型的变量
2)基本介绍
在这里插入图片描述3)最佳实践1

package main
import "fmt"
type Usb interface{
	Start()
	Stop()
}
type Phone struct{
	name string
}
func (p Phone)Start(){
	fmt.Println("电话开始")
}
func(p Phone)Stop(){
	fmt.Println("电话结束")
}
func (p Phone)Call(){
	fmt.Println("手机在打电话")
}
type Camera struct{
	name string
}
func (c Camera)Start(){
	fmt.Println("相机开始")
}
func (c Camera)Stop(){
	fmt.Println("相机结束")
}
type Computer struct{}
func (c Computer)Working(usb Usb){
	usb.Start()
	phone,ok:=usb.(Phone);
	if ok{
		phone.Call()
	}
	usb.Stop()
}
func main(){
	var usbArr [3]Usb
	usbArr[0]=Phone{"vivo"}
	usbArr[1]=Phone{"小米"}
	usbArr[2]=Camera{"索尼"}
	var computer Computer
	for _,v :=range usbArr{
		computer.Working(v)
		fmt.Println()
	}
}

在这里插入图片描述
4)最佳实践2

func TypeJudge(item... interface{}){
	for i,v:=range item{
		switch v.(type){
		case bool:
			fmt.Printf("%v个参数是bool类型,值是%v\n",i,v)
		case int:
			fmt.Printf("%v个参数是int类型,值是%v\n",i,v)
		}
	

	}
}
func main(){
	var n1=true
	var n2 int =23
	TypeJudge(n1,n2)
}

在这里插入图片描述


总结

本文仅仅简单介绍了Golang面向对象编程,此篇是通过b站尚硅谷Golang视频的学习做的笔记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值