英文:
Type cast vs type assertion on concrete struct?
问题
我对golang还不熟悉,所以如果这个问题太幼稚,请原谅。我找了一下,但找不到对我基本问题的答案。
假设我有一个具体的结构体和如下所示的方法。
type MyData struct{
field1 string
field2 int
}
func(a MyData) OperatorOnString() string{
return a.field1.(string)
}
func(a MyData) OperatorOnInt() int{
return a.field2.(int)
}
我的问题是,我可以进行类型转换并返回,而不是进行断言吗?根据我目前所学,断言是用于接口类型的数据。但在这种情况下,我有具体的类型。我是否仍应使用断言,或者我可以像return int(a.field2)
这样做。我知道这个例子很简单,但我困惑的是何时使用这两种转换类型。或者这里是否涉及一些golang的惯用法?
谢谢
英文:
I am new to golang, so appologize if this question is too naive. Looked around, but could not find answer to my basic question.
Lets say I have a concrete struct and methods as shown below.
type MyData struct{
field1 string
field2 int
}
func(a MyData) OperatorOnString() string{
return a.field1.(string)
}
func(a MyData) OperatorOnInt() int{
return a.field2.(int)
}
My question is, can I type cast and return rather than performing assertion? From what I have learned so far is that, assertion is used on data of type interface. But in this case I have concrete type. Should I still use assertion or I can do something like return int(a.field2)
. I know this example is trivial, but the point that I am confused is when to use between the two conversion types. Or is there some golang idiomaticity involved here?
Thanks
答案1
得分: 13
首先,类型断言只能用于接口类型:
> 对于一个接口类型的表达式 x
和一个类型 T
,主表达式
x.(T)
> 断言 x
不是 nil,并且存储在 x
中的值是类型 T
。x.(T)
的表示法被称为类型断言。
但是你正在将其应用于非接口类型的字段(int
和 string
)。这会使编译器不开心。
其次,如果你想从一个方法/函数返回类型 T
,只需要返回一个类型为 T
的表达式,而你的字段恰好就是这种类型。正确的代码就很简单:
package main
import "fmt"
type MyData struct {
field1 string
field2 int
}
func (a MyData) OperatorOnString() string {
return a.field1
}
func (a MyData) OperatorOnInt() int {
return a.field2
}
func main() {
a := MyData{"foo", 42}
fmt.Println(a.OperatorOnString(), a.OperatorOnInt())
}
输出:
foo 42
英文:
First of all, type assertion can be used only on interfaces:
> For an expression x
of interface type and a type T
, the primary expression
x.(T)
> asserts that x
is not nil and that the value stored in x
is of type T
. The notation x.(T)
is called a type assertion.
But you're applying it to non interface typed fields (int
and string
). That makes compiler unhappy.
Secondly, if you want to return type T
from a method/function, it's always enough to return an expression of type T
, which your fields already happen to be. The correct code is then easy:
package main
import "fmt"
type MyData struct {
field1 string
field2 int
}
func (a MyData) OperatorOnString() string {
return a.field1
}
func (a MyData) OperatorOnInt() int {
return a.field2
}
func main() {
a := MyData{"foo", 42}
fmt.Println(a.OperatorOnString(), a.OperatorOnInt())
}
Output:
foo 42
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论