Go语言结构体初始化的成员赋值执行顺序是否有明确保障?
Go结构体初始化执行顺序问题解答
结论
你提供的代码运行后一定会得到obj.a == 1、obj.b == 2的结果,该行为是Go官方明确保障的,不属于未定义行为。
规则说明
Go语言官方规范中明确约定:带键的结构体字面量初始化场景下,所有键值对的表达式求值顺序与源代码中书写的顺序完全一致,按从左到右的顺序依次执行。
你代码中的结构体初始化语句里,a: nextNumber()的书写顺序早于b: nextNumber(),因此执行时会优先调用nextNumber()得到返回值1赋值给字段a,再调用第二次nextNumber()得到返回值2赋值给字段b,最终结果完全确定。
额外补充:该求值顺序和结构体本身的字段定义顺序无关,只和初始化时你书写的键值对先后顺序有关。比如你把结构体定义改成先声明b再声明a,只要初始化时的键顺序还是a在前b在后,最终的结果还是保持不变。
内容的提问来源于stack exchange,提问作者PeterM
相关产品推荐
相关产品推荐

