首頁 >後端開發 >Golang >如何在沒有泛型的 Go 中實作泛型錯誤處理?

如何在沒有泛型的 Go 中實作泛型錯誤處理?

Susan Sarandon
Susan Sarandon原創
2024-11-04 12:48:01352瀏覽

How to Implement Generic Error Handling in Go Without Generics?

在 Go 中實現通用錯誤處理

Go 缺乏通用功能,這在嘗試泛化功能時帶來了挑戰。一個常見的場景是需要一個適用於任何傳回值和錯誤的函數的通用錯誤處理函數。

提供的範例示範了使用空介面建立此類函數的嘗試:

<code class="go">func P(any interface{}, err error) (interface{}) {
    if err != nil {
        panic("error: "+ err.Error())
    }
    return any
}</code>

雖然此方法適用於錯誤處理,但它會遺失類型信息,從而使產生的接口為空。

產生特定於類型的錯誤處理函數

避免遺失類型資訊的問題,考慮使用程式碼產生來為不同類型建立錯誤處理函數的專門實作。這可以使用「gogenerate」、「gengen」、「genny」或「gen」等工具來實現。

例如,使用“gen”,您可以定義一個模板:

<code class="text">// template.go

package main

import "fmt"

func P[T any](v T, err error) (T) {
    if err != nil {
        panic(fmt.Sprintf("error: %v", err))
    }
    return v
}</code>

此模板可用於生成P() 的特定於類型的實現:

<code class="sh">gen generate</code>

這將創建諸如以下的實現:

<code class="go">// p_int.go

package main

func PInt(v int, err error) (int) {
    if err != nil {
        panic(fmt.Sprintf("error: %v", err))
    }
    return v
}</code>

透過使用這些生成的函數,類型資訊被保留,錯誤處理可以無縫地應用於特定類型。

以上是如何在沒有泛型的 Go 中實作泛型錯誤處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn