2.2静态类型与动态类型
静态类型是指由编译器在编译阶段处理有关类型的检查和计算,一旦发现代码中存在类型错误,即宣告编译失败:
- 运行阶段不再处理有关类型的问题,性能高速度快
- 代码中的缺陷充分暴露在编译阶段,运行时更安全
- 代码编辑器可提供代码自动补全等人性化辅助功能
- 数据完整性更好
在Go语言中,代码编写者可以为数据显式地声明类型,也可以让编译器自动推断其类型,但无论那种情况,在编译器看来,数据终归是需要类型的。
// Go语言中的类型
// addition函数指出它接受两个int类型的参数,并返回一个int类型的返回值。如果调用者错误地将一个字
// 符串传给该函数,编译器将捕获这个错误
package main
import "fmt"
func addition(x int, y int) int {
return x + y
}
func main() {
fmt.Println(addition(1, 3))
fmt.Println(addition(1, "3"))
}
// 打印输出:
cannot use "3" (type string) as type int argument to addition
动态类型是指在运行阶段处理有关类型的检查和计算,并可根据需要将一种类型的数据自动转换为另一种类型。
- 语法简单,编写代码速度快
- 无须为执行代码等待编译器完成编译
- 语言规则不死板,易于变更代码,好维护
- 学习门槛更低
Go语言虽然不是动态类型语言,但它借鉴了包括Python在内的很多动态类型语言的优点,至少在形式上比传统意义上的静态类型语言更加简洁,同时又不失安全性。
//简单的JavaScript函数
// 虽然JavaScript有类型的概念,但其使用规则却非常宽松。在第二个对addition函数的调用中,JavaScript
// 对整数1执行类型转换,将其转换为字符串"1",进而返回字符串"13"而非整数4。这将引发灾难性的BUG
var addition = function(x, y) {
return x + y;
};
addition(1, 3) // 4
addition(1, "3") //13