Frequently Asked Questions:返回类型?数值转换?内置map?

135 阅读2分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

Go为什么没有可变的返回类型呢?

Covariant result types (可变的返回类型)指的是下面这种接口例子:

type Copyable interface {
	Copy() interface{}
}

会被下面的方法实现:(实际上并没有)

func (v Value) Copy() Value

乍一看,似乎成立,因为value是实现了空接口。但是在Go中,方法必须准确地匹配。因此Value并没有实现Copyable。Go将类型的概念与类型的实现分开, 如果两种方法返回不同类型,则它们并不是在做同样的事情。程序员想要实现Covariant result types ,通常尝试通过接口表达类型层次结构。在GO语言中,应该尽可能清晰地分开表现出接口和以及它的实现。

Go为什么不支持隐式的数值转换?

在C语言中,数字类型之间的自动转换,带来的便利性掩盖了其带来的困惑性。什么时候值是unsigned?数字的值多大?会溢出吗?在执行的时候是否是独立的,便携的?(PS:不解。附上原文:Is the result portable, independent of the machine on which it executes?)。它也使编译器复杂化; “通常的算术转换”并不容易在架构中实施。因此我们决定以在代码中,必须用一些明确转换,来保证清晰和简单。

相关的一个细节,和C不用,Int和Int64不同,即使Int是64位类型,也是不同的类型。 int类型是通用的; 如果您关心一个integer持有的位,我们鼓励您明确具体位数。

portable 轻便的
arbitrary 随心所欲的,专断的
precision 精确的,精度

为什么map是内置的?

和字符串的原因是相同的:它们是一种强大而重要的数据结构,提供一个优秀的实现,使编程更加轻松。我们认为,GO的map实现方式足够优秀,能够为绝大多数场景提供服务。如果某个应用程序可以用自定义的map实现中受益,则可以写一个,但它不会像语法一样方便。 这似乎是一个合理的权衡。

tradeoff 权衡