登录
首页 >  Golang >  Go问答

GoLang Struct Initializer 的执行顺序

来源:Golang技术栈

时间:2023-04-26 18:07:31 166浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《GoLang Struct Initializer 的执行顺序》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

想知道 GoLang 是否保证了结构初始化的执行顺序。

以下代码是否总是产生

obj.a == 1或者obj.b == 2是未指定的行为?

num := 0

nextNumber := func() int {
    num += 1
    return num
}

type TwoNumbers struct {
    a int
    b int
}

obj := TwoNumbers{
    a: nextNumber(),
    b: nextNumber(),
}

正确答案

指定函数调用的评估顺序。

该代码TwoNumbers{a: nextNumber(), b: nextNumber()}是一个复合文字表达式。调用nextNumber()是表达式中的操作数。

该规范对一般表达式进行了说明:

... 在计算表达式、赋值或返回语句的操作数时,所有函数调用、方法调用和通信操作都按词法从左到右的顺序进行计算。

fielda的函数调用在 field 的函数调用之前进行评估,b因为 field 的函数调用位于field 的函数调用a的左侧b

评估顺序仅针对函数调用、方法调用和通信操作指定。编译器可以重新排序其他操作数的评估。在以下示例中, field 的表达式在a词法上位于 field 的表达式的左侧b,但b首先被评估(在当前编译器中)。

type Numbers struct{ a, b, c int }
nums := Numbers{a: num, b: nextNumber(), c: nextNumber()}
fmt.Println(nums) // prints {2 1 2}

在操场上跑

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《GoLang Struct Initializer 的执行顺序》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>