Node.js转Go:如何实现带泛型与参数的可复用函数?
Go中实现带泛型的可复用request函数
Go 1.18及以上版本支持泛型,完全可以实现你需要的「泛型函数+额外参数」的复用功能,你的代码问题出在泛型参数的声明上,以下是修正后的实现:
修正核心代码
首先修正request方法的泛型声明,确保泛型参数与Handler结构体的类型绑定:
import "context" // 假设你引入了graphql相关包 type Mwapp struct { Debug bool `json:"debug"` Context context.Context `json:"-"` Client graphql.Client `json:"-"` } // 泛型Handler结构体,定义返回类型为T的调用逻辑 type Handler[T any] struct { caller func(ctx context.Context, client graphql.Client) (*T, error) operationName string } // 修正泛型参数声明:明确[T any],参数Handler[T]与泛型T绑定 func (mwapp *Mwapp) Request[T any](handler Handler[T]) (*T, error) { res, err := handler.caller(mwapp.Context, mwapp.Client) return res, err } // 调用示例(需提前定义myAccountResponse、myAccount函数等) func (mwapp *Mwapp) GetMyAccount() (*myAccountResponse, error) { return mwapp.Request(Handler[myAccountResponse]{caller: myAccount, operationName: "GetMyAccount"}) } func (mwapp *Mwapp) GetMyApp() (*myMwappResponse, error) { return mwapp.Request(Handler[myMwappResponse]{caller: myApp, operationName: "GetMyApp"}) }
更贴近TypeScript示例的实现
如果你想直接模仿TS中request<T>(query: string, variables: object)的写法,也可以直接将query、variables作为函数参数,结合泛型返回结果:
// 直接接收query和variables,泛型T指定返回类型 func (mwapp *Mwapp) Request[T any](query string, variables map[string]interface{}) (*T, error) { var result T // 这里替换为你的GraphQL调用逻辑,比如使用graphql.Client执行查询 err := mwapp.Client.Query(mwapp.Context, query, variables, &result) if err != nil { return nil, err } return &result, nil } // 调用示例 func (mwapp *Mwapp) GetMyAccount() (*myAccountResponse, error) { query := `query GetMyAccount { ... }` variables := map[string]interface{}{} return mwapp.Request[myAccountResponse](query, variables) }
关键说明
- 泛型参数声明必须放在函数名之后、参数列表之前,格式为
[T any](any是Go中表示任意类型的约束) - 泛型可以与结构体、方法结合,实现类型安全的复用逻辑
- 调用泛型方法时,Go通常可以自动推导泛型类型(如第一个示例中的
Request调用),如果推导失败则需显式指定(如第二个示例的Request[myAccountResponse])
内容的提问来源于stack exchange,提问作者Kateile
相关产品推荐
相关产品推荐

