Go语言中泛型的一个用法

发布时间 2023-10-03 14:53:22作者: tangjicheng
type OperationWithData[T any] func() (T, error)

type Operation func() error

func (o Operation) withEmptyData() OperationWithData[struct{}] {
	return func() (struct{}, error) {
		return struct{}{}, o()
	}
}

这段Go代码定义了两种类型:OperationOperationWithData,并提供了一种将 Operation 转换为 OperationWithData 的方法。

  1. type Operation func() error:这是一个函数类型,表示一个不带参数且可能返回错误的操作。它接受一个无参数的函数,并在执行时返回一个错误。例如,可以定义一个 Operation 类型的函数,执行某些操作并报告是否出现了错误。

  2. type OperationWithData[T any] func() (T, error):这也是一个函数类型,表示一个带有数据返回值和错误的操作。T 是一个泛型参数,表示返回的数据类型。它接受一个无参数的函数,并在执行时返回一个包含数据值和错误的元组。

  3. func (o Operation) withEmptyData() OperationWithData[struct{}]:这是一个方法,它是在 Operation 类型上定义的。它的目的是将不带数据返回值的 Operation 转换为带有空结构体数据返回值的 OperationWithData

    • Operation 接收者的 o 是一个 Operation 类型的值。
    • withEmptyData 方法返回一个 OperationWithData[struct{}] 类型的函数。

    在方法的内部,它返回了一个函数,该函数执行原始的 Operation,然后返回一个包含空结构体数据和操作结果的元组。这是因为 OperationWithData[struct{}] 类型要求带有数据返回值,即使不需要数据,也可以使用空结构体来满足这一要求。

    示例用法:

    // 定义一个不带数据返回值的操作
    noDataOperation := Operation(func() error {
        return nil
    })
    
    // 使用withEmptyData方法将其转换为带有空结构体数据返回值的操作
    withEmptyDataOperation := noDataOperation.withEmptyData()
    
    // 执行带有空结构体数据返回值的操作
    result, err := withEmptyDataOperation()
    if err != nil {
        fmt.Println("操作失败:", err)
    } else {
        fmt.Println("操作成功,返回的数据:", result)
    }
    

    这段代码演示了如何将不带数据返回值的操作 noDataOperation 转换为带有空结构体数据返回值的操作 withEmptyDataOperation 并执行它。