Golang 的面向对象

这篇具有很好参考价值的文章主要介绍了Golang 的面向对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

duck typing

golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可

package main

import "fmt"

type Person interface {
	talk()
}

type XM struct {
}

func (receiver XM) talk() {
	fmt.Println("I am XM")
}

func main() {
	var p Person
	p = XM{}
	p.talk() // I am XM
}

nil不一定是空接口

初始化的接口是等于 nil的,接口底层其实有一个type来记录原始的struct,当某个struct赋值给接口时,接口会在type中记录该类型(就算是nil也会记录),此时接口打印出来是nil,但和nil并不相等

}

type XM struct {
}

func (X XM) talk() {
	fmt.Println("I am XM")
}

func main() {
	var p Person
	if p == nil {
		fmt.Println("var p Person is nil") //var p Person is nil
	}
	var a *XM
	if a == nil {
		fmt.Println("var a *XM is nil") //var a *XM is nil
	}

	p = a
	if p != nil {
		fmt.Println("var p != nil") //var p != nil
	}

	fmt.Println(p) // <nil>
}

组合代替继承

通过内嵌组合来继承功能,XM匿名内嵌了Person,就具有了Person的能力

package main

import "fmt"

type Person struct {
	Name string
}

func (receiver Person) Talk() {
	fmt.Printf("I am %s \n", receiver.Name)
}

type XM struct {
	Person
}

func main() {
	var xm XM
	p := Person{Name: "Person"}
	xm.Name = "XM"
	xm.Talk() // I am XM
	p.Talk()  // I am Person
}

重写方法只需要声明一个同名方法即可

package main

import "fmt"

type Person struct {
	Name string
}

func (receiver Person) Talk() {
	fmt.Printf("I am %s \n", receiver.Name)
}

type XM struct {
	Person
}

func (receiver XM) Talk() {
	fmt.Printf("hello,I am %s", receiver.Name)
}

func main() {
	var xm XM
	xm.Name = "XM"
	xm.Talk() // hello,I am XM
}

接口转换回具体的类型

struct 转为接口,只要struct 拥有 接口的方法,即可将struct 赋值给接口,如果想将接口转回struct,可以使用 result,ok := interface.(struct), ok 代表是否能够成功转换

package main

import "fmt"

type IAnimal interface {
	Eat()
}

type Bridge struct {
}

func (b Bridge) Eat() {
	fmt.Println("I can eat")
}

func (b Bridge) Fly() {
	fmt.Println("I can fly")
}

type Fish struct {
}

func (f Fish) Eat() {
	fmt.Println("I can eat")
}

func ShowTime(animal IAnimal) {
	animal.Eat()
	if b, ok := animal.(Bridge); ok {
		b.Fly()
	}
}

func main() {
	var (
		f Fish
		b Bridge
	)
	ShowTime(f) // I can eat
	fmt.Println("--------------")
	ShowTime(b) // I can eat \n I can fly
}

ok 判断的是完全转换,就算不ok,转换后的结果也可以调用struct的方法,但是不建议这么做

package main

import "fmt"

type IAnimal interface {
	Eat()
}

type Bridge struct {
	Name string
}

func (b Bridge) Eat() {
	fmt.Println(b.Name + "I can eat")
}

func (b Bridge) Fly() {
	fmt.Println(b.Name + "I can fly")
}

type Fish struct {
	Name string
}

func (f Fish) Eat() {
	fmt.Println(f.Name + "I can eat")
}

func ShowTime(animal IAnimal) {
	animal.Eat()
	b, ok := animal.(Bridge)
	fmt.Println(ok)
	b.Fly()
}

func main() {
	f := Fish{Name: "fish"}
	b := Bridge{Name: "bridge"}
	ShowTime(f)
	// fishI can eat
	// false
	// I can fly
	fmt.Println("--------------")
	ShowTime(b)
	//bridgeI can eat
	// true
	//bridgeI can fly
}

使用switch匹配接口的原始类型

struct.(type) 可以获取接口的原始类型,但是只能在switch中使用文章来源地址https://www.toymoban.com/news/detail-646352.html

package main

import "fmt"

type IAnimal interface {
	Eat()
}

type Bridge struct {
	Name string
}

func (b Bridge) Eat() {
	fmt.Println(b.Name + "I can eat")
}

func (b Bridge) Fly() {
	fmt.Println(b.Name + "I can fly")
}

type Fish struct {
	Name string
}

func (f Fish) Eat() {
	fmt.Println(f.Name + "I can eat")
}

func ShowTime(animal IAnimal) {
	switch animal.(type) {
	case Fish:
		fmt.Println("原先是Fish")
	case Bridge:
		fmt.Println("原先是Bridge")
	}
}

func main() {
	var (
		f Fish
		b Bridge
	)
	ShowTime(f) // 原先是Fish
	ShowTime(b) // 原先是Bridge
}

到了这里,关于Golang 的面向对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang入门教程】Go语言变量的初始化

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站: 人工智能工具 引言 在Go语言中,变量

    2024年04月17日
    浏览(73)
  • 【GoLang入门教程】Go语言几种标准库介绍(六)

    前言 上一篇,我们介绍了image、IO、math三个库,这篇我们继续介绍剩下的库 几种库 Net库 (网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等) 在 Go 语言的标准库中, net 包提供了对网络操作的支持,包括基本的网络协议、Socket 编程、HTTP 客户端和服务器等。 net 包包含多个子包,其

    2024年02月02日
    浏览(56)
  • 【GoLang入门教程】Go语言几种标准库介绍(七)

    前言 上一篇,我们介绍了Net、OS、path三个库,这篇我们继续介绍剩下的库 几种库 plugin库 (Go 1.7 加入的插件系统。支持将代码编译为插件,按需加载) 在 Go 语言的标准库中, plugin 包提供了对 Go 插件的支持。 插件是一种在运行时加载并与主程序交互的机制,允许程序在不重新

    2024年01月16日
    浏览(81)
  • 【GoLang入门教程】Go语言几种标准库介绍(四)

    前言 上一篇,我们介绍了debug、encoding、flag三个库,这篇我们继续介绍剩下的库 几种库 fmt库 (格式化操作) 在 Go 语言的标准库中, fmt 包提供了格式化输入输出的功能。 这个包包括了一系列函数,用于将数据格式化为字符串( fmt.Sprintf )、输出到控制台( fmt.Print 、 fmt.Pri

    2024年02月03日
    浏览(100)
  • 【GoLang入门教程】Go语言几种标准库介绍(五)

    前言 上一篇,我们介绍了fmt、Go、html 三个库,这篇我们继续介绍剩下的库 几种库 image库 (常见图形格式的访问及生成) 在 Go 语言的标准库中, image 包提供了对图像的基本操作和处理功能。 这个包定义了 Image 接口和一些基本的图像类型,同时也包含了一些实现了该接口的具

    2024年02月03日
    浏览(68)
  • 【GoLang入门教程】Go语言几种标准库介绍(八)

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 前言 上一篇,我们介绍了plugin、reflect、regexp三个库,这篇我们继续介绍剩下的库 几种库 runtime库 ( 运行时接口) 在 Go 语言的标准库中, runtime 包

    2024年01月19日
    浏览(60)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(75)
  • 【Go语言】Golang保姆级入门教程 Go初学者chapter3

    下划线“_”本身在Go中一个特殊的标识符,成为空标识符。可以代表任何其他的标识符,但是他对应的值就会被忽略 仅仅被作为站维度使用, 不能作为标识符使用 因为Go语言中没有private public 所以标记变量首字母大写代表其他包可以使用 小写就是不可使用的 注意:Go语言中

    2024年02月13日
    浏览(58)
  • 【Go语言】Golang保姆级入门教程 Go初学者chapter2

    setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/img@main/image-20230726152905139.png)] 变量表示内存中的一个存储区 注意:

    2024年02月14日
    浏览(111)
  • 【Go语言】Golang保姆级入门教程 Go初学者介绍chapter1

    Golang的学习方向 区块链研发工程师: 去中心化 虚拟货币 金融 Go服务器端、游戏软件工程师 : C C++ 处理日志 数据打包 文件系统 数据处理 很厉害 处理大并发 Golang分布式、云计算软件工程师:盛大云 cdn 京东 消息推送 分布式文件系统 2、Golang的应用领域 区块链应用:区块链

    2024年02月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包