前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang接口和多态的基本使用

golang接口和多态的基本使用

作者头像
Java架构师必看
发布2021-05-14 17:07:41
3250
发布2021-05-14 17:07:41
举报
文章被收录于专栏:Java架构师必看Java架构师必看

首先简单的描述一下golang中的struct interface的作用。

简单来说struct代表的是一种结构,比如user有name和age,那么这两个属性就在struct中。而一个struct拥有什么样的行为需要有对应的方法来支持。

代码语言:javascript
复制
type user struct{
    Name string
    Age int
}

比如上面的user结构体,如果想让user有其他的行为需要给user添加方法,添加的时候需要区分是值还是指针。

代码语言:javascript
复制
func (u *User) speak() {
	fmt.Println("i am " + u.name)
}

func (u User) doSome(){
    fmt.Println("do something")
}

使用值还是指针取决于这个类型的本质,不仅仅取决于本次方法中对struct是否有修改来判断。

为了让结构体的方法更有章法,或者为了多态,可以使用接口对方法进行约束,让方法实现接口,这样就起到了规范方法,针对接口编程而不是实现编程。

具体如下:

代码语言:javascript
复制
package demo

import (
	"fmt"
)

type sayer interface {
	speak()
}

type User struct {
	name string
	age  int
}

type Student struct {
	name string
	age  int
}

func NewUser(name string, age int) User {
	return User{
		name: name,
		age:  age,
	}
}

func NewStudent(name string, age int) Student {
	return Student{
		name: name,
		age:  age,
	}
}

func (u *User) speak() {
	fmt.Println("i am " + u.name)
}

func (s *Student) speak() {
	fmt.Println("student-----------:" + s.name)
}

func BaseSay(s sayer) {
	s.speak()
}

具体使用:

代码语言:javascript
复制
package main

import "test/demo"

func main() {
	u := demo.NewUser("aa", 1)
	s := demo.NewStudent("bbbbbbbb", 2)
	demo.BaseSay(&u)
	demo.BaseSay(&s)
}

通过实现同样的接口,在调用的时候使用不同的类,实现执行不同的方法。

运行结果:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档