# 4.1 简介

在程序中，任何一个表达式都包含两个维度的信息：一个是值，一个是类型。例如表达式 `"Golang"` ，其值是字符串 “Golang”, 而类型是 string. 通常情况下，我们将在编译阶段就知道所有类型信息的语言叫着静态语言，而直到运行时才知道类型信息的语言叫着动态语言。

语言的类型规范构成了语言的类型系统，类型系统是对程序行为进行约束的重要措施，类型规范通常会涉及到如下几个方面：

1. 类型种类，例如数字类型、布尔类型、复合类型等；类型种类用来限定类型的范围与界限
2. 预定义的类型，例如常见的 int, float, string 等；用来定义语言的基础类型
3. 构造新类型的规则，用户如何通过已有类型构造出新的类型；形成创建新类型的语法
4. 类型之间的相互关系，例如是否可以相互转换以及相互转换的规则
5. 作用于不同类型的运算符及其规则，例如大多数语言中， `+` 可以作用于数字类型，也可以作用于字符串类型，而 `/` 则无法作用于后者

有了这些规则，用户就可以根据自己的需求构造出任何想要的类型，以便搭建出业务的抽象模型。而语言的类型系统会检查程序的类型是否符合约束，对于静态语言，这个检查发生在编译阶段，而动态语言则发生在运行阶段。静态语言在使用时会伴随着大量的类型申明，例如 `var name string`, 不仅声明了变量名，同时为其指定了类型；而动态语言则无此必要，程序会在运行时将类型信息与值进行绑定。静态语言更加严格，但能够在编译阶段提前发现错误；动态语言更加灵活，但也将问题发现的时机推迟到了运行时刻。

为了使语言的使用更加简便，很多静态语言对类型的声明也不是必须的，只要编译器能够根据上下文推断出实际的类型，就没有必要让用户进行显示地声明，这种能力叫着类型推导。例如我们有函数 `func sum(i, j int) int` , 则在赋值语句 `s = sum(1, 2)` 中，很明显可以推导出变量 `s` 的类型便是函数 `sum` 的返回类型。Go 就具备这种语法特性，在编译阶段， Go 编译器会做两方面的事情：一个是类型推导，一个是类型检查，负责该任务的模块叫着类型检查器（type checker）。接下来我们会详细分析 Go 的类型检查器的实现原理。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gocompiler.shizhz.me/golang-bian-yi-qi-lei-xing-jian-cha/4.1-jian-jie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
