的基础类型
Card可能与的基础类型
string(本身是
string)相同,但是的基础类型
[]Card与的基础类型不同
[]string(因此适用于
Hand)。
您不能将的片转换
T1为的片
T2,这与它们具有什么基础类型
T1无关,如果不相同
T2,就不能。为什么?因为不同元素类型的切片可能具有不同的内存布局(内存大小不同)。例如,类型的元素
[]byte每个占用1个字节。每个元素
[]int32占用4个字节。显然,即使所有值都在范围内,也不能将一个转换为另一个
0..255。
但是要追溯到根本:如果需要切片
Cards,为什么首先要创建切片
strings?您所创建的 类型
Card,因为它 不是
一个
string(或至少不只是一个
string)。如果是这样,而您需要
[]Card,那么
[]Card首先创建,所有问题都将消失:
value := []Card{"a", "b", "c"}firstHand := NewHand(value)fmt.Println(firstHand)请注意,您仍然可以
Card使用未 类型化的 常量
string文字
来初始化的切片,因为它可用于初始化其基础类型为的任何类型
string。如果要涉及类型化的类型
string常量或非常量表达式
string,则需要进行显式转换,例如下面的示例:
s := "ddd"value := []Card{"a", "b", "c", Card(s)}如果您有一个
[]string,则需要从中手动构建一个
[]Card。没有“更轻松”的方式。您可以创建一个辅助
toCards()函数,以便可以在需要的任何地方使用它。
func toCards(s []string) []Card { c := make([]Card, len(s)) for i, v := range s { c[i] = Card(v) } return c}


