Golang Go语言中怎么实现类似__weak 功能?
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
没有,go 没有函数重载,用 interface
更多关于Golang Go语言中怎么实现类似__weak 功能?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个是连接器跟装载器的特性,如果会写 ld 脚本,理论可以实现
可以参考 sql.Register
https://pkg.go.dev/database/sql#Register
go 不需要这种花里胡哨的写法。
binary 分发:cgo 走动态链接
源代码分发:走 build constraint ,你提供一个基础版本的实现,让用户自己写个源代码函数实现,然后 build flag 就可以了
interface 或者传一个函数指针也能实现相同的功能吧,门槛也低
好像用 go 实现这个没什么意义,但这思路用在代码生成上倒是很不错。
在Go语言中,没有直接等同于C++中__weak
关键字的原生功能,__weak
通常用于声明一个弱符号,以避免符号冲突或实现某种形式的可选依赖。然而,Go语言的设计哲学和编译模型与C++有显著不同,因此需要通过其他方式来实现类似的功能。
要在Go中实现类似__weak
的效果,可以考虑以下几种方法:
-
接口和空实现: Go语言中的接口可以定义一个方法集,而不关心具体实现。你可以定义一个接口,并提供一个空实现(即一个结构体实现了接口中的所有方法,但方法体为空)。这样,当某个依赖项不存在时,可以使用这个空实现作为回退。
-
依赖注入和可选依赖: 使用依赖注入框架(如Wire、Uber的Dig等)来管理依赖关系。这些框架允许你定义可选的依赖项,并在运行时检查它们是否存在。
-
错误处理和默认值: 在尝试使用某个可能不存在的依赖项时,通过错误处理逻辑来提供默认值或回退行为。
-
插件系统: 如果你的应用程序足够复杂,可以考虑实现一个插件系统。这样,你可以在运行时加载或卸载特定的功能,而无需在编译时静态地链接它们。
每种方法都有其适用场景和优缺点,选择哪种方法取决于你的具体需求和应用程序的复杂性。