英文:
Avoid too much conversion
问题
我当前的Go代码中有一些部分看起来像这样:
i := int(math.Floor(float64(len(l)/4)))
由于math.Floor
中的某些函数类型签名,这种冗长似乎是必要的,但它可以简化吗?
英文:
I have some parts in my current Go code that look like this:
i := int(math.Floor(float64(len(l)/4)))
The verbosity seems necessary because of some function type signatures like the one in math.Floor
, but can it be simplified?
答案1
得分: 12
一般来说,Go语言的严格类型导致了一些冗长的表达式。冗长并不意味着口吃。类型转换可以做一些有用的事情,有必要明确地表达这些有用的事情。
简化的关键是不写不必要的类型转换,为此你需要参考诸如语言定义之类的文档。
在你的具体情况中,你需要知道len()返回int类型,并且值大于等于0。你需要知道4是一个常量,在这个表达式中将会被赋予int类型,并且你需要知道整数除法将返回整数商,而在这种情况下将是一个非负的int,实际上正是你想要的答案。
i := len(l)/4
这个例子很简单。
英文:
In general, the strict typing of Go leads to some verbose expressions. Verbose doesn't mean stuttering though. Type conversions do useful things and it's valuable to have those useful things explicitly stated.
The trick to simplification is to not write unneeded type conversions, and for that you need to refer to documentation such as the language definition.
In your specific case, you need to know that len() returns int, and further, a value >= 0. You need to know that 4 is a constant that will take on the type int in this expression, and you need to know that integer division will return the integer quotient, which in this case will be a non-negative int and in fact exactly the answer you want.
i := len(l)/4
This case is an easy one.
答案2
得分: 2
我不确定Go如何处理整数除法和整数转换,但通常是通过截断来实现的。因此,假设len(l)是一个int类型的变量:
i:=len(l)/4
否则,i:= int(len(l))/4
或 i:=int(len(l)/4)
应该可以工作,其中第一个理论上比第二个稍微快一些。
英文:
I'm not 100% sure how Go deals with integer division and integer conversion, but it's usually via truncation. Thus, assuming len(l) is an int
i:=len(l)/4
Otherwise i:= int(len(l))/4
or i:=int(len(l)/4)
should work, with the first being theoretically slightly faster than the second.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论