如何将嵌入的泛型字段设为未导出?泛型类型别名问题求助
解决泛型类型嵌入时隐藏方法的问题
在非泛型场景中,你可以通过未导出的类型别名嵌入外部类型,从而隐藏其所有导出方法,仅重写需要的方法。但泛型类型无法创建别名,这里提供两种可行方案:
方案一:使用未导出的泛型结构体作为中间层
定义一个未导出的泛型结构体,嵌入外部泛型类型,再将这个未导出结构体嵌入你的目标结构体。这样外部类型的方法会被提升到未导出结构体,但包外无法访问这些提升的方法,你只需在目标结构体上重写需要的方法即可。
package yourpackage import "external" // 未导出的泛型结构体,嵌入外部类型 type otherType[T any] struct { external.OtherType[T] } // 你的目标泛型结构体 type MyType[T any] struct { otherType[T] } // 重写需要自定义的方法 func (m *MyType[T]) CustomMethod() { // 自定义逻辑 // 若需调用原方法,可通过 m.otherType.CustomMethod() 访问 }
方案二:直接持有未导出的泛型字段
在目标结构体中定义未导出字段存储外部泛型类型,手动实现需要重写的方法,如需保留原类型的某些方法,可手动转发调用。这种方式更灵活,能精确控制哪些方法被导出。
package yourpackage import "external" type MyType[T any] struct { impl external.OtherType[T] // 未导出字段 } // 重写目标方法 func (m *MyType[T]) CustomMethod() { // 自定义实现 } // 手动转发需要保留的方法(可选) func (m *MyType[T]) KeepMethod() { m.impl.KeepMethod() }
两种方案都能实现:重写指定方法的同时,避免外部类型的所有方法被自动导出。方案一更接近你原本的非泛型实现方式,方案二则能更精准地控制暴露的方法。
内容的提问来源于stack exchange,提问作者kuokongqingyun
相关产品推荐
相关产品推荐

