英文:
Why is "if s, ok := it.(TaggerShape); ok {" and "else if s, ok := it.(TaggerShape); ok {" in the same function?
问题
这段代码重复调用了相同的函数两次,这是因为我对Go语言还不太熟悉,所以很可能是我的误解。
func Tag(it Shape, tag string) Shape {
if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
} else if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
}
return NewSave(it, tag)
}
这段代码的作用是给形状对象添加标签。如果形状对象实现了TaggerShape
接口,就调用AddTags
方法并返回该对象。否则,如果形状对象实现了TaggerShape
接口,同样调用AddTags
方法并返回该对象。如果都不满足,则调用NewSave
函数创建一个新的保存对象并返回。
这段代码的来源是:https://github.com/cayleygraph/cayley/blob/275a7428fb10fdb4d1167f09a7120898239903dd/graph/iterator/save.go#L14-L23
英文:
Isn't this code repeating the same call twice? I am new to go, so this is most likely my own misunderstanding.
func Tag(it Shape, tag string) Shape {
if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
} else if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
}
return NewSave(it, tag)
}
It is from here: https://github.com/cayleygraph/cayley/blob/275a7428fb10fdb4d1167f09a7120898239903dd/graph/iterator/save.go#L14-L23
答案1
得分: 1
是的,它是重复的。你可以移除else if
块:
func Tag(it Shape, tag string) Shape {
if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
}
return NewSave(it, tag)
}
所以你知道it.(TaggerShape)
的含义,来自规范:
对于一个接口类型的表达式x和类型T,主表达式x.(T)断言x不是nil,并且存储在x中的值是类型T。x.(T)的表示法称为类型断言。
更准确地说,如果T不是接口类型,x.(T)断言x的动态类型与类型T相同。在这种情况下,T必须实现x的(接口)类型;否则,类型断言是无效的,因为x不可能存储类型T的值。如果T是接口类型,x.(T)断言x的动态类型实现了接口T。
英文:
Yes, it's duplicated. You can remove the else if
block:
func Tag(it Shape, tag string) Shape {
if s, ok := it.(TaggerShape); ok {
s.AddTags(tag)
return s
}
return NewSave(it, tag)
}
So just you know what it.(TaggerShape)
means, from the spec:
> 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.
>
> More precisely, if T is not an interface type, x.(T) asserts that the
> dynamic type of x is identical to the type T. In this case, T must
> implement the (interface) type of x; otherwise the type assertion is
> invalid since it is not possible for x to store a value of type T. If
> T is an interface type, x.(T) asserts that the dynamic type of x
> implements the interface T.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论