Go语言面向对象编程

本文探讨了Go语言中的单例模式实现,强调了在多线程环境下使用sync.Once确保原子性的必要性。同时,展示了结构体组合的概念,通过一个Bird结构体实例说明如何组合不同类型的结构体成员。此外,文章还介绍了Go语言的泛型使用,包括基本的泛型函数定义和自定义泛型类型,以实现更灵活的类型约束。
摘要由CSDN通过智能技术生成


构造函数

在这里插入图片描述

在这里插入图片描述

单例模式

单例模式为了防止多线程下冲突,需要sync.Once保证原子性。
在这里插入图片描述


结构体组合

在这里插入图片描述

package main

import "fmt"

type Plane struct {
	Color string
	name string
}

func (Plane) fly() int {
	return 500
}

type Car struct {
	speed int
}

func (car Car) run() {
	fmt.Printf("run at %d km/h\n", car.speed)
}

type Bird struct {
	Name string
	Plane
	Car
}

func (bird Bird) fly() int {
	return 1000
}
func main() {
	bird := Bird{Name: "鸟", Plane: struct{ Color string
		name string}{Color: "红",name:"123"}, 
		Car: struct{ speed int }{speed: 10}}

	bird.run()
	fmt.Println(bird.Color, bird.speed)
	bird.speed = bird.fly() //调用bird重写后的fly
	bird.run()
	bird.speed = bird.Plane.fly() //显示调用,调用的是plane的fly
	bird.run()

}

在这里插入图片描述

结构体组合,在创建对象时赋值,需要先指定组合结构体的内部类型:
在这里插入图片描述


泛型

go泛型使用方法
泛型类似于C++中的模板。旨在为程序员生成代码,减少重复代码的编写。

// 使用泛型
func add[T int | int8 | float32](a, b T) T {
	return a + b
}

func main() {
	a := 4
	b := 7
	var c, d float32 = 4.0, 4.1
	fmt.Println(add(a, b))
	fmt.Println(add(c, d))
	//fmt.Println(add1[int, float32](a, d))
}

如果类型太多,这时候我们就可以自定义泛型类型:

//像接口一样声明泛型的类型
type Addable interface {
	int | float32 | string
}
//指定泛型的类型
func add1[T Addable](a, b T) T {
	return a + b
}

func add2[T1 Addable, T2 Addable](a T1, b T2) int {
	return 1
}
func main() {
	a := 4
	b := 7
	var c, d float32 = 4.0, 4.1
	fmt.Println(add(a, b))
	fmt.Println(add(c, d))
	fmt.Println(add2(a, d))
	//显示地指定泛型类型
	fmt.Println(add2[int, float32](a, d))
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也要写bug、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值