Golang Go语言中怎么实现类似__weak 功能?

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

stm32 开发中经常能见到这样的函数:

_weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);

/* NOTE : This function should not be modified, when the callback is needed, the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file. */ }

我只需要随便在一个地方重写这个函数,它最终调用的就是我的函数:

void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
{
  //做一些爱做的事情
}

如果我只想定义些简单的函数,用户可以在自己喜欢的地方重写它,go 中怎么实现类似的功能,或者 go 中有更好的实现?


Golang Go语言中怎么实现类似__weak 功能?

更多关于Golang Go语言中怎么实现类似__weak 功能?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

没有,go 没有函数重载,用 interface

更多关于Golang Go语言中怎么实现类似__weak 功能?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个是连接器跟装载器的特性,如果会写 ld 脚本,理论可以实现

go 不需要这种花里胡哨的写法。
binary 分发:cgo 走动态链接
源代码分发:走 build constraint ,你提供一个基础版本的实现,让用户自己写个源代码函数实现,然后 build flag 就可以了

interface 或者传一个函数指针也能实现相同的功能吧,门槛也低

好像用 go 实现这个没什么意义,但这思路用在代码生成上倒是很不错。

在Go语言中,没有直接等同于C++中__weak关键字的原生功能,__weak通常用于声明一个弱符号,以避免符号冲突或实现某种形式的可选依赖。然而,Go语言的设计哲学和编译模型与C++有显著不同,因此需要通过其他方式来实现类似的功能。

要在Go中实现类似__weak的效果,可以考虑以下几种方法:

  1. 接口和空实现: Go语言中的接口可以定义一个方法集,而不关心具体实现。你可以定义一个接口,并提供一个空实现(即一个结构体实现了接口中的所有方法,但方法体为空)。这样,当某个依赖项不存在时,可以使用这个空实现作为回退。

  2. 依赖注入和可选依赖: 使用依赖注入框架(如Wire、Uber的Dig等)来管理依赖关系。这些框架允许你定义可选的依赖项,并在运行时检查它们是否存在。

  3. 错误处理和默认值: 在尝试使用某个可能不存在的依赖项时,通过错误处理逻辑来提供默认值或回退行为。

  4. 插件系统: 如果你的应用程序足够复杂,可以考虑实现一个插件系统。这样,你可以在运行时加载或卸载特定的功能,而无需在编译时静态地链接它们。

每种方法都有其适用场景和优缺点,选择哪种方法取决于你的具体需求和应用程序的复杂性。

回到顶部