• 火夫
    2021-11-12
    个人觉得iota在一些场景下是方便一些,但更关键的在于代码可读性要好。像标准库syscall下有大量定义的常量,如果使用iota会看得头晕,心智负担太大。

    作者回复: 没错,也有一些场合不适于使用iota。你提到的syscall场合算是一个。因为系统调用的编号以及错误码值几乎形成了标准,直接用原值更好,也方便查找。

    
    28
  • ivhong
    2022-03-07
    老师您好,我有个疑惑,望老师有时间帮忙解答一下。 go在普通类型变量计算时有意的取掉了隐式类型转换,而在常量计算时又有意的加上隐式类型转换,为什么要“特意”的区别设计呢?

    作者回复: 好问题!我的理解是:变量避免隐式转换是消除类型不安全的问题。而常量本身是不可改变的,不存在安全问题,untyped常量的“隐式”可以理解为一种“语法糖”。

    
    22
  • 多选参数
    2021-11-21
    有人老觉得 iota 没用,或者用的不多,但是在我看来,那可能是拿 Go 来实现了别的语言也可实现的一套,我觉得选择一门语言,更多是选择这门语言拥有的一些新特性,然后使用这些新特性。

    作者回复: 没错,要学习一门语言,最终目的就是学会用这门语言的思维去写这门语言的代码。go coding in go way. 而不为go coding in c way, or java way.

    共 3 条评论
    10
  • lesserror
    2021-11-13
    Tony Bai 老师的每篇文章都很精彩。以下困惑,麻烦有空解答一下: 1. 文中说:“但由于转型的对象是一个常量,所以这并不会引发类型安全问题,Go 编译器会保证这一转型的安全性。” 我理解的是Go编译器在编译阶段就能发现类型错误的问题,也就从而保证了类型转换的安全性吧。因为常量的类型的确定和运算都是在编译期间完成的。老师想表达的是这个意思吗? 2. 对于:iota怎么读比较准确呢?例如做技术分享的时候,直接每个字母分开来读的吗? 3. 1 << 2 等于 4 这种位运算 老师考虑在本课程中讲解吗?

    作者回复: 1. 差不多 2. iota的确是一个单词,表示“极微小”的意思。标准读音是 [aɪ'oʊtə] . 不过你也知道,很多程序员界的术语都读乱了,就像nginx这个词读啥的都有。 3. 篇幅有限,位运算没列入专题讲解。

    共 7 条评论
    6
  • mikewoo
    2022-04-21
    老师,请教一个问题,文中提到c语言借助宏定义字面值的形式作为常量类型,是在预编译阶段处理的,但是具有不安全性,请问这个不安全性怎么理解呢

    作者回复: 这里指类型安全。 提到类型安全,我们需要先说一下什么是类型安全。类型安全是一个计算机科学中的概念,主要指编程语言阻止或防止类型错误的程度水平。比如将一个字符串类型变量传递给一个接受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

    共 2 条评论
    4
  • 功夫熊猫
    2021-11-13
    当你定义的值是一些固定值,比如端口或者进城的时候。或者就是那个数特别大

    作者回复: good。

    
    4
  • Geek_b6da5d
    2021-11-12
    颜色rgba,各种size等,都需要显式字面值

    作者回复: 可以的。

    
    4
  • 冯仁彬
    2022-09-10 来自辽宁
    枚举经常会用到负数,go中怎么定义呢

    作者回复: go没有enum类型,可以用int型常量来模拟,可结合iota。

    
    3
  • zzy
    2022-07-12
    那go中是否支持复杂枚举呢,类似java中的,比如枚举中每个个体有name,code等

    作者回复: go语法连枚举类型都不支持,只是用常量“间接实现”了枚举值。你说的复杂枚举就更不支持了。

    
    3
  • DullBird
    2021-11-14
    比如错误码,经常可能根据业务的情况删除不用的错误码。增加新的错误码?有动态增删情况的场景这样定义常量不好。适合比较固定。或者只增加的情况

    作者回复: 提醒一下,如果错误码随着api已经发布,那么还是尽量不要删除,可以标识作废。否则api就是不兼容的,需要升级api大版本。

    
    3