我刚开始使用Go,所以这很明显。编译器不允许以下代码:(http://play.golang.org/p/3sTLguUG3l)
package main
import "fmt"
type Card string
type Hand []Card
func NewHand(cards []Card) Hand {
hand := Hand(cards)
return hand
}
func main() {
value := []string{"a", "b", "c"}
firstHand := NewHand(value)
fmt.Println(firstHand)
}
错误是: /tmp/sandbox089372356/main.go:15: cannot use value (type []string) as type []Card in argument to NewHand
从规格上看,[] string看起来与[] Card不是相同的基础类型,因此无法进行类型转换。
确实是这样,还是我错过了什么?
如果是这样,为什么会这样呢?假设在一个非宠物示例程序中,我输入了一个字符串切片,是否可以将其“投射”到Card切片中,或者是否必须创建一个新结构并将数据复制到其中?(我想避免这种情况,因为我需要调用的函数会修改切片内容)。
的基础类型Card
可能与的基础类型string
(本身是string
)相同,但是的基础类型[]Card
与的基础类型不同[]string
(因此适用于Hand
)。
您不能将的片转换T1
为的片T2
,这与它们具有什么基础类型T1
无关,如果不相同T2
,就不能。为什么?因为不同元素类型的切片可能具有不同的内存布局(内存大小不同)。例如,类型的元素[]byte
每个占用1个字节。每个元素[]int32
占用4个字节。显然,即使所有值都在范围内,也不能将一个转换为另一个0..255
。
但是要追溯到根本:如果需要切片Card
s,为什么首先要创建切片string
s?您所创建的 类型 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
}
问题内容: 我想将字符串切片转换为指向字符串的指针切片 %!p(string = a)=>字符串 %!p(string = b)=>字符串 %!p(string = c)=>字符串 [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0] 据我了解, 我的变量似乎是一个字符串,而不是指向字符串的指针。 因此应从迭代时复制。 显然我不正确,因为地址仍然相同。如果值不是指针,该
问题内容: 例如输入:(类型:) 转换示例:(类型:的切片) 问题答案: 除了mhutter的答案外,还请注意您的输入看起来像一个JSON数组(也许是来自JSON文本?)。 如果您这样处理,则可以将其内容编组为一个切片。直接解析其中的数字并不会更快(因为该包使用了反射),但是它肯定更简单: 输出(在Go Playground上尝试):
问题内容: 在这个奇怪的例子中,有人创建了一个新类型,它实际上只是一个字符串: 但是,此代码无法编译: 不能在返回参数中使用Foobar(CustomType类型)作为类型字符串 您将如何修复SomeFunction,使其能够返回Foobar的字符串值(“ somestring”)? 问题答案: 将值转换为字符串:
问题内容: 一个激励人的例子: 实施各种调度“策略”,对“作业”列表进行排序。 一种非常简单的策略是首先执行最短的作业(不考虑其权重/优先级)。 嗯,这种策略只不过是对job.length进行排序,因此让我们使用sort包。定义一个自定义类型,并实现sort.Interface … 好了,现在回到我们的简单策略… 嗯… 问题答案: 首先, 即使您使用like ,也看不到任何定义 。 我认为您的意思
问题内容: 我想知道为什么你不能做: 我发现这将需要运行时在片上执行循环以转换每个元素,这将是非惯用的Go。这很有道理。 然而,这可能不会被刚刚走样编译器解决的,所以在内部它们是相同的,他们使用相同类型的头底下?我猜答案虽然不是我好奇为什么。 问题答案: 这个: 是类型转换。根据规范,转换具有特定的规则: 在以下任何一种情况下,可以将非恒定值转换为类型: 是分配给。 的类型,并且具有相同的基础类型
问题内容: 我正在尝试使用Go语言,并且对它很陌生。我已经成功地完成了教程,现在正在编写一个小程序来评估其通常执行的操作类型的性能。我有一个很长的float32类型切片,需要将其尽可能有效地转换为float64类型的切片。除了遍历slice的元素并通过output [i] = float64(data [i])显式转换单个元素的类型外,还有没有一种方法可以用来转换整个slice而无需迭代?我曾尝试