Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在go中将变量赋值给u时不会抛出已声明但未使用的错误?_Go - Fatal编程技术网

为什么在go中将变量赋值给u时不会抛出已声明但未使用的错误?

为什么在go中将变量赋值给u时不会抛出已声明但未使用的错误?,go,Go,我声明了一个变量“x”,但没有使用它 包干管 func main{ var x int=10 _=x } 在上面的程序中,我将x的值赋给uu空白标识符 空白标识符是一个只写变量,不能使用,因此,这里不使用x就相当于说了 但为什么它不抛出错误呢?x不是在浪费内存吗? 编译器不应该将x视为已声明但未使用的吗? 这是一个bug还是故意的? 如果是故意的,背后的原因是什么? go编译器是否自动添加任何指令以释放上述程序中的x内存? 如果创建了大量此类变量并将其分配给uu,会对性能产生影响吗? 1-它是一

我声明了一个变量“x”,但没有使用它

包干管 func main{ var x int=10 _=x } 在上面的程序中,我将x的值赋给uu空白标识符

空白标识符是一个只写变量,不能使用,因此,这里不使用x就相当于说了

但为什么它不抛出错误呢?x不是在浪费内存吗? 编译器不应该将x视为已声明但未使用的吗? 这是一个bug还是故意的? 如果是故意的,背后的原因是什么? go编译器是否自动添加任何指令以释放上述程序中的x内存? 如果创建了大量此类变量并将其分配给uu,会对性能产生影响吗?
1-它是一个声明的局部变量,并被使用。为什么这会是一个错误?编译器可以选择通过消除它来优化它

声明并使用2-x。它的值被读取并丢弃

3/4-像这样使用uu赋值没有意义。它还有其他用途,例如在range语句中

5-在上面,x并没有逃逸到堆,所以它被分配到堆栈上。没有必要释放它

但为什么它不抛出错误呢

因为语言规范说不应该

x不是在浪费内存吗

这是一个实现细节,与语言规范无关。人们可以合理地假设它不会使用内存,因为那里没有变量,但有许多Go实现,每个Go实现都可以在这方面做出自己的决定

编译器不应该将x视为已声明但未使用的吗

没有

这是一个bug还是故意的

这是故意的

如果是故意的,背后的原因是什么

除了询问语言作者之外,猜测是唯一的可能性,这与StackOverflow的主题无关

go编译器是否自动添加任何指令以释放上述程序中的x内存

同样,这是一个实现细节,不在规范中定义,可能会发生更改

如果创建了大量此类变量并将其分配给uu,会对性能产生影响吗


可能不会。但再一次,这是一个实现细节,并且在实现之间可以不同。

因为语言就是这样的:空白标识符提供了一种忽略赋值中的右侧值的方法:编译器实际上所做的完全是一个实现细节。@JimB我想知道这个实现细节。好吧,默认的Go编译器不使用LLVM,所以没有LLVM指令可以查看。查看编译后的机器代码,了解它对特定编译器实现和版本的作用。标准Go编译器使用优化,这意味着很容易找到和删除无效赋值的指令,例如对ux的赋值。无论它在任何特定情况下是否真的能做到这一点,都需要专家来权衡,或者自己测试。我们大多数人都没有深入研究编译器。为什么要阅读并扔掉它。如果你正在阅读一些东西,应该使用它。不使用它而阅读它有什么意义?你不知道它是分配的。编译器可能会忽略它。关键是,正如所写的那样,它是一个有效的go程序。因为没有=x,x是声明的,但从未使用过。这就是作业的工作原理。不,他们不是。阅读语言规范。@JavaTechnical:绝对测量影响的唯一方法是测试并实际测量它。在这个简单的例子中,您可以转储机器代码,看到有问题的两行代码根本没有编译。那么,在So中实现细节是否被认为是离题的呢?为什么答案不能包括一些关于实现细节的解释呢?它们不是离题的,不是。但是因为有很多实现,您必须指定您感兴趣的实现。列出所有实现以及它们如何处理这一问题,即使这一点是已知的,但这充其量也是不切实际的,而且可能是不可能的。