Golang学习笔记02

封装

将结构体,字段的属性都小写,类似于private

给结构体提供一个工厂模式的函数,首字母大写

提供一个首字母大写的set方法,对属性赋值

提供一个首字母大写的get方法,对属性访问

package main

import "fmt"

type people struct {
	Name string
	age  int
}

// 定义工厂模式函数
func NewPeople(name string) *people {
	return &people{
		Name: name,
	}
}

func (p *people) SetAge(age int) {
	if age > 0 {
		p.age = age
	} else {
		fmt.Println("传入年龄不正确")
	}
}

func (p *people) GetAge() int {
	return p.age
}

func main() {
	p := NewPeople("张三")
	p.SetAge(18)
	fmt.Println(p.Name)
	fmt.Println(p.age)
}

继承

package main

import "fmt"

type animal struct {
	Age    int
	Weight float32
}

func (an *animal) Shout() {
	fmt.Println("喊叫")
}

func (an *animal) Show() {
	fmt.Printf("动物的年龄:%v,动物的体重:%v", an.Age, an.Weight)
	fmt.Println()
}

// 定义结构体进行复用
type Cat struct {
	animal
}

func (c *Cat) scratch() {
	fmt.Println("喵喵挠人")
}

func main() {
	cat := &Cat{}
	cat.Age = 10
	cat.Weight = 100
	cat.Show()
	cat.Shout()
	cat.scratch()
}

go中虽然保留了多继承,但是不建议使用

package main

import "fmt"

type A struct {
	a int
	b string
}

type B struct {
	c int
	d string
	a int
}

type C struct {
	A
	B
}

func main() {
	var c = C{A{10, "100"}, B{20, "200", 30}}
	fmt.Println(c.A.a)
	fmt.Println(c.B.a)
	fmt.Println(c.b)
	fmt.Println(c.b)
	fmt.Println(c.d)
}

接口

定义规范,让别人来实现,golang中不需要显示实现接口,比java语法松散

package main

import "fmt"

type say interface {
	sayHello()
}

type China struct {
}

func (person China) sayHello() {
	fmt.Println("你好")
}

type English struct {
}

func (person English) sayHello() {
	fmt.Println("hello")
}

// 定义函数,专门用来各国人打招呼,接受具备say接口能力的变量
func greet(s say) {
	s.sayHello()
}
func main() {
	c := China{}

	e := English{}

	greet(c)
	greet(e)
}

不能用接口创建实例,但可以指向实现该接口的自定义数据类型

自定义数据类型也能够实现接口,不仅仅是结构体

接口可以继承接口,弹药实现所有方法

interface是一个指针(引用类型)

空接口没有任何方法,所以可以理解为所有的类型都实现了接口,也可以理解为我们可以把
任何一个变量赋值给空接口

多态

在Golang中多态通过接口实现

func main() {
c := China{}
e := English{}
greet(c)
greet(e)
} //此时是多态的一种体现

断言

判断是否是该类型的变量

func greet(s say) {
s.sayHello()
//断言写法
var c = s.(China) //判断是否可以转化为China类型
c.chinaFunc()
}
func main() {
c := China{}
//e := English{}
greet(c)
//greet(e)
}

第二种写法

func greet(s say) {
s.sayHello()
//断言写法
//var c = s.(China) //判断是否可以转化为China类型
//c.chinaFunc()
ch, flag := s.(China)
if flag {
ch.chinaFunc()
} else {
fmt.Println("转化失败")
}
}

e {
	sayHello()
}

type China struct {
}

func (person China) sayHello() {
	fmt.Println("你好")
}

type English struct {
}

func (person English) sayHello() {
	fmt.Println("hello")
}

// 定义函数,专门用来各国人打招呼,接受具备say接口能力的变量
func greet(s say) {
	s.sayHello()
}
func main() {
	c := China{}

	e := English{}

	greet(c)
	greet(e)
}

不能用接口创建实例,但可以指向实现该接口的自定义数据类型

自定义数据类型也能够实现接口,不仅仅是结构体

接口可以继承接口,弹药实现所有方法

interface是一个指针(引用类型)

空接口没有任何方法,所以可以理解为所有的类型都实现了接口,也可以理解为我们可以把
任何一个变量赋值给空接口

多态

在Golang中多态通过接口实现

func main() {
c := China{}
e := English{}
greet(c)
greet(e)
} //此时是多态的一种体现

断言

判断是否是该类型的变量

func greet(s say) {
s.sayHello()
//断言写法
var c = s.(China) //判断是否可以转化为China类型
c.chinaFunc()
}
func main() {
c := China{}
//e := English{}
greet(c)
//greet(e)
}

第二种写法

func greet(s say) {
s.sayHello()
//断言写法
//var c = s.(China) //判断是否可以转化为China类型
//c.chinaFunc()
ch, flag := s.(China)
if flag {
ch.chinaFunc()
} else {
fmt.Println("转化失败")
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值