一、基本介绍
在go语言中,并没有像传统面向对象编程语言(java、c++)中那样的类和继承的概念。go语言采用了结构体和组合的方式来实现类似的功能。
在go语言中,可以通过结构体嵌套来实现类似父类与子类的关系。当一个结构体嵌套了另一个结构体时,外层的结构体可以访问其嵌套结构体的字段和方法,这种方式被称为组合。go语言中通过方法接受者的类型来决定方法的归属和继承关系。
示例代码:
package main import "fmt" // 父类 type parent struct { name string } // 父类的方法 func (p *parent) sayhello() { fmt.println("hello, i'm", p.name) } // 子类 type child struct { parent // 嵌入父类 age int } func main() { // 创建子类对象 c := &child{ parent: parent{name: "john"}, age: 10, } // 调用父类的方法 c.sayhello() // 访问父类的字段 fmt.println("parent name:", c.name) // 访问子类的字段 fmt.println("child age:", c.age) }
输出结果:
hello, i'm john
parent name: john
child age: 10
二、接口的使用
go语言可以在接口(interface)中声明一个方法但没有具体实现。接口在go中是一种定义行为的类型,它允许你声明一个方法签名(方法名称、输出参数和返回值),而不需要实现这个方法。任何类型都可以实现这个接口,只要它提供了与接口声明中相同名称、相同签名的方法。
示例代码,父类的方法中使用了子类的方法:
package main import "fmt" // 定义一个接口,包含子类想要实现的方法 type bmethod interface { b() } // 父类 type parent struct{} // 父类的方法,接受一个实现了bmethod接口的参数 func (p *parent) a(b bmethod) { fmt.println("parent's a method") b.b() // 调用传入的b方法 } // 子类 type child struct { *parent // 嵌入父类,虽然在这个例子中嵌入并没有实际作用,因为parent没有数据字段 } // 子类实现bmethod接口的b方法 func (c *child) b() { fmt.println("child's b method") } func main() { child := &child{} child.a(child) // 显式地将child作为参数传递给a方法 }
在go语言中,一个结构体可以实现一个或多个接口。当结构体定义了与接口中声明的方法签名相匹配的方法时,我们就说该结构体实现了该接口。这并不需求显式地声明结构体实现了某个接口,而是通过实现接口中的方法来隐式地完成。
示例代码:
package main import "fmt" // 定义一个接口 type shape interface { area() float64 } // 定义一个结构体 type rectangle struct { width float64 height float64 } // 为rectangle结构体实现area方法 func (r rectangle) area() float64 { return r.width * r.height } func main() { // 创建一个rectangle对象 rect := rectangle{width: 10, height: 5} // 调用area方法 fmt.println("rectangle area:", rect.area()) // 隐式地将rectangle对象赋值给shape接口变量 var s shape s = rect // 通过接口变量调用area方法 fmt.println("shape area:", s.area()) }
到此这篇关于golang中实现类似类与继承的方法的文章就介绍到这了,更多相关golang类与继承内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论