27.用组合代替继承-golang中的面向对象

这篇博客探讨了Go语言不支持继承但支持组合的特点。通过结构体嵌入,可以实现组合,例如博客文章由标题、内容和作者信息组成。文章展示了如何创建`Post`和`Author`结构体,并通过嵌入`Author`到`Post`中,使得`Post`能访问`Author`的字段和方法。此外,还讨论了如何处理结构体切片的嵌入,以创建一个包含多个博客文章的`Website`结构体。

原文:https://golangbot.com/inheritance/


欢迎访问Golang 系列教程中的第27章。

go 不支持继承(inheritance), 但是它支持组合(composition)。构图的一般定义是 “放在一起”。组合的一个示例是小轿车。汽车由轮子、引擎和其他各种各样的零件组成。

通过嵌入结构进行组合

通过将一个结构类型嵌入到另一个中, 可以在Go中实现组合。

博客文章是作文的完美典范。每个博客帖子都有标题、内容和作者信息。这可以用构图完美地表示出来。在本教程的下一个步骤中, 我们将学习如何完成这项工作。

让我们首先创建author结构。

package main

import (  
    "fmt"
)

type author struct {  
    firstName string
    lastName  string
    bio       string
}

func (a author) fullName() string {  
    return fmt.Sprintf("%s %s", a.firstName, a.lastName)
}

在上面的代码段中, 我们创建了一个具有字段firstNamelastNamebioauthor结构。我们还添加了一个方法fullName() , 并将author作为接收器类型, 并返回作者的全名。

下一步是创建post结构。

type post struct {  
    title     string
    content   string
    author
}

func (p post) details() {  
    fmt.Println("Title: ", p.title)
    fmt.Println("Content: ", p.content)
    fmt.Println("Author: ", p.author.fullName())
    fmt.Println("Bio: ", p.author</
<think>嗯,用户想了解Golang和Java在编程范式上的区别。首先得明确编程范式包括哪些方面,比如面向对象、函数式、并发模型等等。然后要分别分析Golang和Java在这些方面的特点。记得之前引用的内容里提到,Go的并发是语言级别的,用goroutine和channel,而Java用线程和锁。这应该是并发编程范式的不同。Java是典型的面向对象语言,而Go虽然支持面向对象,但更偏向组合而不是继承,可能这是OOP范式上的差异。 还有,Java有函数式编程的特性,比如Lambda表达式,而Go的函数是一等公民,但可能没有Java的函数式库丰富。这点需要确认。 另外,错误处理机制不同,Go用显式错误返回,Java用异常处理。这也属于编程范式的一部分。内存管理方面,Java自动垃圾回收,Go也是,但具体实现可能不同,不过这可能更多属于语言特性而不是范式。需要确保区分编程范式和语言特性,比如并发模型属于范式,而语法结构属于特性。引用中的资料提到Go的并发是语言原生支持,属于并发范式的不同。Java的并发基于线程模型,属于另一种范式。还要注意用户提到的“尤其是编程范式”,所以重点在两者的设计理念和所支持的范式,比如是否多范式、主要偏向哪种。可能需要指出Java是面向对象为主,支持部分函数式;而Go是过程式加并发导向,面向对象的方式不同。需要检查引用内容是否有其他相关点,比如引用5提到Go解决了一些老旧语言的问题,可能影响其设计范式。比如Go的类型系统更简洁,可能影响其面向对象的方式。然后组织回答的结构,先总述区别,再分点对比,比如面向对象、并发模型、函数式支持、错误处理范式等。每个点引用对应的引用资料,比如并发部分引用4,面向对象引用5或3。最后生成相关问题,可能涉及具体应用场景、性能对比、学习曲线等,需要结合之前的引用内容,比如引用2提到的未来趋势,引用3的应用场景。</think>### Golang 与 Java 编程范式对比 #### 1. **面向对象编程(OOP)** - **Java**: 严格遵循面向对象范式,支持类、继承、多态、接口等特性。例如,通过`class`定义对象,使用`extends`实现继承,并通过抽象类和接口实现多态[^3]。 ```java public class Animal { void sound() { System.out.println("Animal sound"); } } public class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } } ``` - **Golang**: 采用轻量级的面向对象设计,通过结构体(`struct`)和方法(`method`)实现,但**不支持继承**,而是通过**组合**和**接口嵌入**实现代码复用[^5]。例如: ```go type Animal struct {} func (a Animal) Sound() { fmt.Println("Animal sound") } type Dog struct { Animal } // 组合代替继承 func (d Dog) Sound() { fmt.Println("Bark") } // 方法重写 ``` #### 2. **并发编程范式** - **Golang**: 原生支持**协程(goroutine)**和**通道(channel)**,属于**CSP(Communicating Sequential Processes)模型**。通过`go`关键字启动协程,强调通过通信共享数据而非共享内存[^4]。 ```go ch := make(chan int) go func() { ch <- 1 }() // 协程向通道发送数据 result := <-ch ``` - **Java**: 基于**线程(Thread)**和**锁(synchronized)**,属于共享内存模型。需显式管理线程生命周期,并通过锁或并发工具类(如`ExecutorService`)控制同步[^4]。 ```java new Thread(() -> System.out.println("Thread running")).start(); ``` #### 3. **函数式编程支持** - **Java**: 从 Java 8 开始支持函数式编程,提供Lambda表达式、流式API(`Stream`)和函数式接口(如`Function`、`Predicate`)[^3]。 ```java List<Integer> list = Arrays.asList(1, 2, 3); list.stream().map(x -> x * 2).forEach(System.out::println); ``` - **Golang**: 函数是一等公民,支持闭包和高阶函数,但**无内置函数式编程工具链**(如流式处理)。需手动实现类似逻辑: ```go list := []int{1, 2, 3} for _, v := range list { fmt.Println(v * 2) } ``` #### 4. **错误处理范式** - **Java**: 使用**异常机制**(`try-catch`),强制处理受检异常(Checked Exceptions),如`IOException`[^5]。 ```java try { FileReader file = new FileReader("test.txt"); } catch (IOException e) { e.printStackTrace(); } ``` - **Golang**: 采用**显式错误返回**(多返回值模式),通过`if err != nil`逐层处理错误,无异常机制[^5]。 ```go file, err := os.Open("test.txt") if err != nil { log.Fatal(err) } ``` #### 5. **类型系统与泛型** - **Java**: 强类型且支持泛型(如`List<T>`),类型系统复杂但严谨,需显式声明类型[^3]。 - **Golang**: 类型系统简洁,早期无泛型(Go 1.18 后引入),强调接口的隐式实现(Duck Typing)[^5]。 --- ### 总结对比表 | 范式 | Golang | Java | |--------------|-------------------------------------|-------------------------------------| | 面向对象 | 组合优先,无继承 | 类继承,多态 | | 并发模型 | CSP(goroutine/channel) | 线程/锁 | | 函数式支持 | 基础闭包 | Lambda/Stream API | | 错误处理 | 显式返回错误 | 异常机制 | | 类型系统 | 隐式接口,后期泛型 | 强类型,泛型完善 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值