我正在使用自定義型別,當像下面這樣涉及指標時我遇到了問題。
以下代碼有效:
package main
import (
"fmt"
)
type deck []string
func newDeck(cards ...string) deck {
return cards
}
下面的代碼也有效:
package main
func str(n []string) *[]string {
return &n
}
下面的代碼是無效的。為什么這樣?我必須寫一個型別轉換,比如return (*deck)(&cards)
package main
import (
"fmt"
)
type deck []string
func newDeck(cards ...string) *deck {
return &cards // compiles with return (*deck)(&cards)
}
uj5u.com熱心網友回復:
有關分配(包括回傳)的規則在Go 規范中定義: Assignability。與您的案例相關的是:
V并且T具有相同的基礎型別,并且 V 或 T 中的至少一個不是命名型別。
和基礎型別:
如果 T 是預先宣告的 boolean、numeric 或 string 型別之一,或者是 type literal,則相應的基礎型別是 T 本身。
第一個示例可以編譯,因為[]string它是具有基礎型別[]string(本身)的未命名型別文字,并且deck是具有基礎型別[]string(根據您的型別定義)的命名型別。
第二個示例無法編譯,因為兩者*[]string都是*deck未命名的型別文字,它們本身是(不同的)基礎型別。
要編譯第二個示例,您不能依賴直接賦值,但正如您發現的那樣,使用顯式型別轉換
return (*deck)(&cards)
由于以下規則,這種轉換是有效的:
忽略 struct 標記(見下文),
x的型別 和T是非命名型別的指標型別,它們的指標基型別不是型別引數,但具有相同的底層型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462808.html
上一篇:基于模板函式引數的指標級回傳型別
