golang 使用记录

最近在学习 golang,在学习和使用过程中的想法,心得会记录在这里,方便以后总结。今天这篇是关于 golang 使用组合实现的面向对象编程的特点。

golang 官网对关于 golang 是不是面向对象语言的回答是:是, 也不是。golang 使用组合的方式实现了面向对线的编程方式。但是这与其他语言的面向对象有些许出入。记录如下:

我们先看一段 python 编写的代码:

class A:
	def b(self):
		self.c()
		
	def c(self):
		print("A-----c")
		
		
class B(A):
	def c(self):
		print("B-----c")
		
		
if __name__ == "__main__":
	b = B()
	b.b()

执行结果:

PS E:\Project\Python> python .\test.py
B-----c

A 类有 b, c 两个方法, 在 b 方法中调用的 c 方法, 打印 A-----c, B 类继承自 A 类, 并重写的 A 中的 c 方法。B 类的实例调用 b 方法时,实际调用的是 B 类中重写过的 c 方法, 因此打印的是 B-----c

再来看一段 golang 代码:

package main

import "fmt"

type A struct {
	name string
}

func (a *A) S() {
	a.P()
}

func (a *A) P() {
	fmt.Printf("A-----P")
}

type B struct {
	A
}

func (a *B) P() {
	fmt.Printf("B-----P")
}

func main() {
	b := &B{A: A{name: "B"}}
	b.S()
}

执行结果:

PS E:\Project\Python> go run .\test.go
A-----P

可以看到, 虽然在 B 类中重写了 P 方法, 但是通过 B 类的实例调动 S 方法的时候实际调用的还是 A 类的 P 方法。
原理尚不知晓,先记录这个结果,慢慢研究,估计与 golang 使用组合实现面向对象编程有关。

posted @ 2022-06-01 14:28  鱼与海  阅读(53)  评论(0)    收藏  举报