作者回复: 没错,也有一些场合不适于使用iota。你提到的syscall场合算是一个。因为系统调用的编号以及错误码值几乎形成了标准,直接用原值更好,也方便查找。
作者回复: 好问题!我的理解是:变量避免隐式转换是消除类型不安全的问题。而常量本身是不可改变的,不存在安全问题,untyped常量的“隐式”可以理解为一种“语法糖”。
作者回复: 没错,要学习一门语言,最终目的就是学会用这门语言的思维去写这门语言的代码。go coding in go way. 而不为go coding in c way, or java way.
作者回复: 1. 差不多 2. iota的确是一个单词,表示“极微小”的意思。标准读音是 [aɪ'oʊtə] . 不过你也知道,很多程序员界的术语都读乱了,就像nginx这个词读啥的都有。 3. 篇幅有限,位运算没列入专题讲解。
作者回复: 这里指类型安全。 提到类型安全,我们需要先说一下什么是类型安全。类型安全是一个计算机科学中的概念,主要指编程语言阻止或防止类型错误的程度水平。比如将一个字符串类型变量传递给一个接受int类型参数的函数时,语言编译器是否能检测出问题。 如果你学过C语言,你就知道宏是在预处理阶段仅仅是做的字符串替换。也就是说宏定义的所谓常量就是一个“字符串”,没有携带任何类型信息,即便对一个函数原型为int Foo(int num)的函数进行如下调用: #define NUM "5" void Foo(int num) { printf("num = %d\n", num); } int main() { Foo(NUM); } 调用中的NUM在预处理阶段被替换为"5",但预处理过程也不会有任何报错,因为预处理阶段没有“类型”的概念。 这样问题就被漏到了编译期间。编译器是否能捕捉到这个问题?不一定。在我的gcc上会给出warning。 $gcc testmacro.c testmacro.c:12:7: warning: incompatible pointer to integer conversion passing 'char [2]' to parameter of type 'int' [-Wint-conversion] Foo(NUM); ^~~ testmacro.c:5:15: note: expanded from macro 'NUM' #define NUM "5" ^~~ testmacro.c:7:14: note: passing argument to parameter 'num' here void Foo(int num) { ^ 1 warning generated. 但是如果程序员忽略warning,这部分错误就会留到 程序运行期间。 运行这个例子: $a.out num = 62984116
作者回复: good。
作者回复: 可以的。
作者回复: go没有enum类型,可以用int型常量来模拟,可结合iota。
作者回复: go语法连枚举类型都不支持,只是用常量“间接实现”了枚举值。你说的复杂枚举就更不支持了。
作者回复: 提醒一下,如果错误码随着api已经发布,那么还是尽量不要删除,可以标识作废。否则api就是不兼容的,需要升级api大版本。