Google的Go语言是一种类型安全的语言吗?


14

此页面http://golang.org/doc/go_faq.html写道:

尽管Go具有静态类型,但该语言尝试使类型感到比典型的OO语言更轻量

所以我的问题恰恰是它是使用泛型(例如C#)安全地键入还是使用松散类型(例如javascript)或可选(例如Vb.Net中的option严格)安全地键入?


@JamesMcNellis的意思是,如果类型失败,那只能是因为我进行了类型转换(任何其他操作都不会导致类型异常)
Pacerier

1
@ davidk01 Java将编译(1 +“ boo”),并且Java的漂亮类型安全。该表达式对其具有确定的静态含义,因为该语言对String对象重载了+,并且所有原始文字都可以类型提升为包装的对象,然后可以将其转换为String。
Trixie Wolf

Answers:


26

类型安全是否不是黑白类型安全。它的使用范围更广,某些语言的类型安全性可能比其他语言更高(反之亦然)。但是,我认为您对C#和Javascript的想法可能是静态类型(在编译时进行类型检查)与动态类型(在运行时进行类型检查)-当然,那是Go FAQ在说什么。

Google Go是静态类型的,但是许多功能使它看起来(至少在某种程度上)是动态类型的。例如,您无需将类明确标记为实现任何接口。如果您的类的方法签名与接口上的方法签名匹配,则您的类会自动实现该接口(一种鸭子式输入)。这对于扩展内置类和第三方库中的类很有用,因为您只需组成接口以匹配第三方类上的方法,它将自动实现它。

类型安全实际上是类型系统的另一个“轴”。例如,C是一种静态类型的语言,它不是类型安全的-指针使您几乎可以做任何您喜欢的事情,甚至会崩溃程序。Javascript是动态键入的,但也是类型安全的:您无法执行会使程序崩溃的操作。C#主要是类型安全的,但是您可以显式标记unsafe那些已经不再执行类型安全的代码区域,并且可以做一些不再是类型安全的事情。

Google Go也是类型安全的,即您不会弄乱类型并使程序崩溃(不能直接访问指针)。


除非您使用“不安全”软件包,否则您可以按照自己喜欢的任何方式使程序崩溃:)
Eloff

可以弄乱类型并且可以访问指针。是的,这样做很容易使程序崩溃。
eithed

4

安全键入该类型将永远不会引起误解,但是错误类型可能导致程序崩溃。


我不明白,这是否意味着实际上可以编译非类型安全代码?(除非使用动态功能,否则在c#中是不可能的)
Pacerier's

从类型上进行类型声明基本上就像在动态类型上调用方法一样
dan_waterworth 2011年

好的,总之它没有C#允许的类型安全吗?
2011年

如果您不键入断言,它也会。
dan_waterworth 2011年

5
@Pacerier:完全可以在没有动态的情况下在C#中运行错误键入的表达式:只需在任意位置插入强制类型转换(基本上就是类型断言的类型)。
sepp2k 2011年

-1

Go的地图类型不是线程安全的,它是静态类型的。它也没有任何类型继承,通用编程,断言,方法重载或指针算术,这都是有充分理由的。

类型安全性和存储安全性是长期目标,这是一个问题。

类型安全性带来了可以接受的开销(以千字节和兆字节为单位)。Go是使用MapReduce和“大数据”设计的,数据量为PB级,这会带来类型安全性方面的性能问题,类型检查(装箱/拆箱)会增加系统开销,并缩短处理周期。

类型安全性在子类型和多态性以及鸭子类型(将对象投射到对象)中可能受到限制,这会带来危险,还会给Go之类的语言带来巨大好处。C ++和Java不会被Go取代,它是帮助分布式编程和大规模并行系统的一种新语言。

布鲁斯·埃克尔(Bruce Eckel)的一句大话“对于C ++最初打算解决的问题类别来说,意义更大”,这值得商bat。C ++是一种非常有效的语言,而MapReduce的Boost实现非常有效。

并发原语是未来。类型安全一直是一个非常有争议的话题,Go可能是20年来或自Algol以来解决该问题的第一语言。


3
可悲的是,我需要更高的声誉才能将此答案设为-1。类型安全性不是开销,运行时开销绝对不是以字节为单位来衡量的,并且go在Java的意义上确实具有装箱/拆箱。静态类型使编译器可以进行比动态类型语言更多的优化。Map reduce既不存在也不存在,与线程安全同在。
艾洛夫

Golang的成语是让您使用空接口作为通用模式来断言类型,以避免将泛型实现为一种语言功能,这绝对不是我认为的“类型安全”的东西,虽然它可以使语言规范保持简单,但是当问题出局时出现(并且将会),这将使现在离开解决该问题的人的菜板变得复杂,而该问题由管道水龙头golang称为特征的问题来解决。它看起来似乎不是过去20年中设计的语言,因为有些语言可以更好地解决类型安全问题。
tsturzl19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.