gpt4 book ai didi

go - 在 Go 中传递具有未知参数类型的函数引用

转载 作者:IT王子 更新时间:2023-10-29 00:38:22 25 4
gpt4 key购买 nike

我正在使用一个第三方库,它有两个函数,每个函数返回不同的类型。例如。 ArticleResponseCommentResponse

我想将调用这些函数中的任何一个的结果传递到我自己的函数中。作为该函数的第二个参数,我想传递一个描述如何将该响应打印到标准输出的函数引用。

response := GetArticles()
processResponse(response, printResponse)

func printResponse(response <what_type?>) {
for i := range response.Articles {
fmt.Println(response.Articles[i].Title)
}
}

我不清楚如何强制或创建泛型类型,以便 printResponse 函数知道期望在其参数中传递什么。

如果我没有对我在这里尝试做的事情提供足够好的描述,请告诉我,我将编辑/更新问题。

最佳答案

在这种情况下,您唯一真正的选择是让 processResponse 接受一个 interface{} 和一个接受它的函数,然后为 printResponse 接受相同的空接口(interface)并对其进行类型断言(或使用类型开关)。例如:

func main() {
response := GetArticles()
processResponse(response, printResponse)
}

func processResponse(response interface{}, printResponse func(interface{}))
{
// Process
printResponse(response)
}

func printResponse(response interface{}) {
switch r = reponse.(type) {
case ArticleResponse:
for i := range r.Articles {
fmt.Println(r.Articles[i].Title)
}
case CommentResponse:
for i := range r.Comments {
fmt.Println(r.Comments[i].Topic, r.Comments[i].User)
}
}
}

但是,更常见的样式是您的响应本身具有 Print 方法(或类似方法),并且您的处理函数接受表示该通用方法的接口(interface)。例如:

type ArticleReponse struct {
// ...
}

func (a ArticleReponse) Print() {
for i := range a.Articles {
fmt.Println(a.Articles[i].Title)
}
}

type CommentResponse struct {
// ...
}

func (c CommentResponse) Print() {
for i := range c.Comments {
fmt.Println(c.Comments[i].Topic, c.Comment[i].User)
}
}

type Response interface {
Print()
}

func main() {
response := GetArticles()
processResponse(response)
}

func processResponse(response Response)
{
// Process
response.Print()
}

这种样式允许响应类型自己定义它们的打印行为,而 processResponse 函数只知道它获得了某种能够打印自身的类型。这还允许您将其他方法添加到 Response 接口(interface),processResponse(或任何其他方法)可能需要这些方法才能与这些类型进行交互,而实际上不必知道它是哪种类型。这大大降低了您的代码的脆弱性,因为它不再依赖于每种响应类型的实际实现细节。它还允许您通过模拟 Response 接口(interface)来独立地对 processReponse 进行单元测试。

关于go - 在 Go 中传递具有未知参数类型的函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com