3 回答

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
您不能返回nil任何類型。例如,如果int用作類型參數(shù),則T返回nil沒有意義。nil也不是結(jié)構(gòu)的有效值。
您可能會做的——以及有意義的事情——是為用于 的類型參數(shù)返回零值T。例如,零值nil用于指針、切片,它是空字符串string,0用于整數(shù)和浮點(diǎn)數(shù)。
如何返回零值?只需聲明一個類型的變量T,然后返回它:
func getZero[T any]() T {
var result T
return result
}
測試它:
i := getZero[int]()
fmt.Printf("%T %v\n", i, i)
s := getZero[string]()
fmt.Printf("%T %q\n", s, s)
p := getZero[image.Point]()
fmt.Printf("%T %v\n", p, p)
f := getZero[*float64]()
fmt.Printf("%T %v\n", f, f)
哪些輸出(在Go Playground上嘗試):
int 0
string ""
image.Point (0,0)
*float64 <nil>

TA貢獻(xiàn)1797條經(jīng)驗 獲得超6個贊
*new(T)成語_
這已被建議作為 golang-nuts 中的首選選項。如果/當(dāng)一些零值內(nèi)置被添加到語言中時,它可能不太可讀,但更容易找到和替換。
它還允許單行賦值。
new內(nèi)置函數(shù)為任何類型的變量分配存儲空間并返回指向它的指針,因此取消引用*new(T)有效地為T. 您可以使用類型參數(shù)作為參數(shù):
func Zero[T any]() T {
return *new(T)
}
如果T是可比較的,這可以方便地檢查某個變量是否為零值:
func IsZero[T comparable](v T) bool {
return v == *new(T)
}
var類型T
直截了當(dāng)且更易于閱讀,盡管它總是需要多一行:
func Zero[T any]() T {
var zero T
return zero
}
命名返回類型
如果您不想顯式聲明變量,則可以使用命名返回。不是每個人都喜歡這種語法,盡管當(dāng)你的函數(shù)體比這個人為的例子更復(fù)雜時,或者如果你需要在defer語句中操作值時,這可能會派上用場:
func Zero[T any]() (ret T) {
return
}
func main() {
fmt.Println(Zero[int]()) // 0
fmt.Println(Zero[map[string]int]()) // map[]
fmt.Println(Zero[chan chan uint64]()) // <nil>
}
命名返回的語法不可能與 var 聲明的語法非常相似。
使用您的示例:
func (list *mylist[T]) pop() (data T) {
if list.first != nil {
data = list.first.data
list.first = list.first.next
}
return
}
返回nil不可空類型
如果您真的想這樣做,如您的問題中所述,您可以明確返回*T。
當(dāng)類型參數(shù)T被限制為不包括指針類型的東西時,可以做到這一點(diǎn)。在這種情況下,您可以將返回類型聲明為*T,現(xiàn)在您可以返回nil,這是指針類型的零值。
// constraint includes only non-pointer types
func getNilFor[T constraints.Integer]() *T {
return nil
}
func main() {
fmt.Println(reflect.TypeOf(getNilFor[int]())) // *int
fmt.Println(reflect.TypeOf(getNilFor[uint64]())) // *uint64
}
讓我再次聲明一下:當(dāng)不受任何允許指針類型的限制時,這最有效,T否則你得到的是指針到指針類型:
// pay attention to this
func zero[T any]() *T {
return nil
}
func main() {
fmt.Println(reflect.TypeOf(zero[int]())) // *int, good
fmt.Println(reflect.TypeOf(zero[*int]())) // **int, maybe not what you want...
}

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊
您可以初始化一個空變量。
if l == 0 {
var empty T
return empty, errors.New("empty Stack")
}
- 3 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報