数据类型
简介中提到 Go 是一个静态强类型语言,在常见的编程语言中,它们的数据类型都会以动静态、强弱来区分。当然也有特例,汇编是无类型的。
比如 C/C++ 是静态弱类型语言,Java C# 是静态强类型,还有动态弱类型:JavaScript PHP,动态强类型:Python Scheme
什么是动静态、强弱类型呢?
- 对于动静态类型而言,在编译时就知道变量类型的,是静态类型;运行时才知道一个变量类型的,叫做动态类型。
对于 Go 语言,有时候定义变量不会声明类型,例如 i := 0
。 这名为 类型推导,当定义一个变量却不显式指定类型时候,类型由值推导而出。
var i int
j := i // j 是 int 类型
k := 0 // k 是 int 类型
如果值是数字,则新的变量可能是 int、float64、complex128,这时候类型推导会取决于常量的精度。
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
类型推导通过已知的类型在编译时期推导出不知道的变量的类型,在静态类型语言中对一个变量做该变量类型所不允许的操作会报出语法错误。 具有类型推论的语言除了 Go 还有:Rust Haskell Scala C# C++
- 而强弱类型的区别在于是否允许隐式转换,允许的是弱类型,反之是强类型。
在 Python 中进行 '666' / 2
你会得到一个类型错误,这是因为强类型语言中是不允许隐式转换的。 而在 JavaScript 中进行 '666' / 2
你会得到整数 333,这是因为在执行运算的时候字符串 '666' 先被转换成整数 666,然后再进行除法运算。
强类型语言一般需要在运行时运行一套类型检查系统,因此强类型语言的速度一般比弱类型要慢。 弱类型语言由于在运行时缺乏类型系统,在初学 C 语言的时候就可能会遇到数组访问越界的情况。
静态类型由于在编译期会进行优化,所以一般来说性能是比较高的。 动态语言在进行类型操作的时候还需要解释器去猜测其类型,因此性能会低一些。
在上述所说的动静态、强弱类型的四种语言中,不考虑其他因素单就类型而言,执行的速度应该是 C > Java > JavaScript > Python 不过静态强类型的语言写起来往往更安全的。