首先让我们看一段程序:

func main() {
	fmt.Printf("%v",300.0/0.0)
}

结果:

prog.go:9:23: division by zero

编译器报错了, 这符合我们传统的数学概念:除数不能为0, 再看一段程序:

func main() {
	var x float64 = 0.0
	fmt.Printf("%v",300.0/x)
}

这段程序会输出什么结果呢?

+Inf

什么是 +Inf 呢? 正无穷大 ! 那除数能为0了?

实际上,根据IEEE-754标准,这种情况也许允许的, 下面是原文:

The divideByZero exception shall be signaled if and only if an exact infinite result is defined for an operation on finite operands. The default result of divideByZero shall be an ∞ correctly signed according to the operation:
― For division, when the divisor is zero and the dividend is a finite non-zero number, the sign of the
infinity is the exclusive OR of the operands’ signs (see 6.3).
― For logB(0) when logBFormat is a floating-point format, the sign of the infinity is minus (−∞).

上面的意思是: 

当且仅当为有限操作数上的操作定义了准确的无限结果时,才应发信号通知divideByZero异常。 divideByZero的默认结果应为∞, 它的符号则参考根据下面的操作:
- 对于除法,当除数为零且被除数为有限的非零数时,无穷大的符号是操作数符号的异或(见6.3)。
- 对于logB(0),当logBFormat是浮点格式时,无穷大的符号为负(-∞)。 

所以Golang在运行时,对于除数为0的情况不报错是符合标准的。 那Golang对于除数为0的运算有哪些规则呢?

1. 所有被0除的整数都得报错

2. 就算使用符号 _ , 需要报错的地方还得报错

3. 所有除0的浮点数都不会报错

4. 所有除0的复数都不会报错