Golang Go语言代码复用问题

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言代码复用问题

用过 OOP 的都知道,子类重写父类的方法可以优雅的实现代码的复用,例如:

public class People {
    String name;
    int age;

    public void hello() {
        System.out.printf("name:%s age:%d sex:%s\n", name, age, sex());
    }

    //子类重写该方法即可复用 hello 方法的逻辑
    public String sex() {
        return "unknown";
    }

    static class Male extends People {
        @Override
        public String sex() {
            return "M";
        }
    }

    static class Female extends People {
        @Override
        public String sex() {
            return "F";
        }
    }

    public static void main(String[] args) {
        new Male().hello();
        new Female().hello();
    }
}

然而在 go 中使用组合的方式实现不了,例如: https://play.golang.org/p/LnBeOxPZALF

现在我是用了一个不太优雅的方式进行复用了,不知道各位 v2 大佬们对这种情况有没有什么好的写法建议。


更多关于Golang Go语言代码复用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

你可能需要的是 interface{}

更多关于Golang Go语言代码复用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


楼上说的对.

接口了解一下

现在就是用接口实现的,总感觉怪怪的 🥶,可能还是太习惯 OOP 了吧,https://play.golang.org/p/fsAfWNNkFOI

p.Sex.sex() 可以写成 p.sex()

func hello(name string, age int, gender string) { … }

duck type 了解下,interface 欢迎你

哈哈,不要在意这些细节

鸭子类型了解下。
定义接口,具体类实现接口,业务类手握接口类型,暴露接口接收接口类型的参数,传入具体实现对象。

像 5 楼说的那样,匿名字段的方法可以直接调用的,不明白楼主想要的是什么样子

你想说的是 Go 不支持继承,这个话题都被聊烂了,搜一下全是内容。

因为 go 的 compose 不是类型继承,而是省略成员名称的语法糖。
比如 m.name 实际上是 m.People.name,如果 Male 没有 sex()方法,m.sex()实际上是 m.People.sex() 返回 unknown,但如果 Male 自己也有这个成员则会覆盖这种语法糖,m.sex()确实会返回"M",这和 java 的 override 是一样的,看起来并没有什么问题。
问题在 say()方法的接收器上,say()方法的接收器是*People 类型,当你调用 m.say()实际上是 m.People.say(),say()方法接收到的参数 p 不是 m 而是 m 的一个成员 m.People,p.sex()调用的是 m.People.sex(),自然而然就返回 unknown 了。

你需要一个
type People interface { Hello() Sex() }

定义
type Male struct {
People
}
type Female struct {
People
}
分别实现 Sex 方法

golang 是组合的概念

继承优雅?
呵呵呵呵

//go
type People interface {
Hello()
Sex()
}

type Male struct {
name string
age int
}

func NewMale(name string, age int) *Male {
return &Male{name: name, age: age}
}

func (m Male) Hello() {
fmt.Printf(“name: %s, age %d\n”, m.name, m.age)
}

func (m Male) Sex() {
fmt.Println(“Male”)
}

type Female struct {
}

func (f Female) Hello() {
panic(“implement me”)
}

func (f Female) Sex() {
panic(“implement me”)
}

func main() {
var p People

p = NewMale(“mick”, 18)
p.Hello()
p.Sex()
}

类似这样?

关于Golang(Go语言)中的代码复用问题,以下是一些专业的解答和建议:

一、代码复用的重要性

代码复用是软件开发中的重要概念,它可以提高开发效率、减少代码冗余、降低维护成本,并使代码更加可维护和可扩展。

二、Golang中的代码复用方法

  1. 使用包管理工具:如Go Modules,可以方便地引入和管理第三方库,实现依赖关系的管理。
  2. 定义接口:通过接口实现代码的高度抽象和灵活性,保证代码的一致性并提高复用性。
  3. 使用结构体:封装相关的属性和方法,实现数据的封装和代码的复用。
  4. 组合:通过组合多个结构体,实现不同属性和方法的复用,灵活组合多种功能。

三、代码复用的实践技巧

  1. 遵循单一职责原则:将代码拆分成更小、更可复用的单元。
  2. 编写单元测试:保证代码的正确性和稳定性,便于后续维护和修改。
  3. 提取函数:将重复的代码提取到单独的函数中,减少代码重复。

综上所述,Golang提供了多种方法和技巧来实现代码复用。通过合理使用这些方法和技巧,可以显著提高开发效率、降低维护成本,并编写出更加健壮和可扩展的代码。

回到顶部