Golang语法错误:favFood := "Italian"作为值使用

Golang语法错误:favFood := "Italian"作为值使用 语法错误:favFood := “Italian” 被用作值

首先,我不理解变量和值之间的区别,尽管我已经在谷歌上研究过这个问题。

以下是我使用的代码:https://play.golang.org/p/CITzl422dkU

我正在尝试创建一个使用switch语句的程序,该语句的switch表达式被指定为类型为string、标识符为"favFood"的变量。

20 回复

谢谢!我开始明白了。

更多关于Golang语法错误:favFood := "Italian"作为值使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我再次仔细阅读了这些信息,很有帮助。

感谢这个解释。非常有帮助。我会保存它。

ConstSpec 是标识符的另一种说法吗?

不知道我有多感激您的详细解释。
在您的常量声明 a = 0 中,为什么不写成 a := 0

您关于switch语句的帮助很有用,我会保存下来。

那么,在“switch nationality”中,nationality是一个整数吗?我不太理解这一点。

这些信息非常有帮助,我会保存下来。我仔细研究了一遍,相信以后还会需要参考它。

ConstSpec 描述了 Golang 语法中的一个非终结符。请点击链接查看其定义

你指的是那些蓝色字母吗?那就是语法吗?如果是的话,我不知道该怎么处理它们。

我注意到你代码中的差异了。谢谢你。

最后部分也明白了。感谢你提供的信息。

= 是一个赋值运算符,它允许您为已声明的变量(或常量)赋值。另一方面,:= 是另一种声明 赋值变量的方式(一种简写形式)。const 用于声明常量,因此 := 的声明加赋值语法不适用于常量。

var a int
a = 1    // set a to 1
fmt.Println(a)    // prints “1”
a = 2    // change the value of a to 2
fmt.Println(a)    // prints “2”

很棒

c = 3 // c == 3 (iota == 2, 未使用) 这很有趣。 我不确定该如何表述以下问题。即使代码中没有使用iota这个词,iota是否在Go程序中仍然有效?

func main() {
    fmt.Println("hello world")
}

"4"是一个值。你无法改变4这个值。变量用于存储值。变量中存储的值可以改变——或者,如果你愿意这么说,可以被另一个值替换。如果变量之前存储的是4,而你将其设置为5,你并没有改变4这个值,而是替换了变量中的值。

favFood := "Italian"

是一个声明变量的语句(声明了favFood变量)并为其赋值(Italian)。这个语句本身不是一个值——它是一个语句。

(其他语言对于什么是值有不同的规则。但在Go语言中就是这样的。)

嗨 Cherolyn,

这是另一种编写 switch 语句的方法。我建议你学习这种方式,因为它非常高效且不需要计算机进行过多运算。由于 switch 后面的表达式只是一个整数,它只需寻找具有匹配整数的 case 语句。在许多情况下,编译器生成的代码允许计算机仅通过执行几条简单的机器指令就能跳转到正确的 case 语句,而无需比较字符串或执行任何比较操作。

func main() {
    fmt.Println("hello world")
}

此外,即使你认为某些情况永远不会执行,包含一个默认 case 通常是个好习惯。这有助于捕获编程错误。

首先,这是switch语句的语法:https://golang.org/ref/spec#Switch_statements。(注意,表达式必须以分号’;'结尾。)

其次,这是您尝试实现的内容:https://play.golang.org/p/WZC2BuCHvzG

最后,如果您在switch代码块中不需要’favFood’,只需这样做:https://play.golang.org/p/QPkOFqCHs0k

另外,字符串值必须用双引号’"'括起来。

是的,nationality 是一个整数。这行代码

nationality := italian

声明 nationalityitalian 具有相同的类型,而 italian 是一个 const 常量。italian 是使用 iota 定义的:

italian = iota

以下是 Go 语言规范中关于 iota 的部分:

https://golang.org/ref/spec#Iota

如果你理解了 iota 的工作原理,你就会知道 italian 的实际值是 0(零),而括号内与它一起声明的其他常量则从此处开始向上计数(123…)。

(在规范中,iota 被称为无类型整数常量,这意味着具体的整数类型会在稍后,当该值被用于某些地方时确定。如果你现在还不理解这一点,不必担心。)

嗨 Cherolyn,

有两个原因。

首先,你只能在函数定义内部使用短变量声明(使用 := 操作符)。

看看在函数外部尝试使用短变量声明时的错误信息:

链接

它将其视为赋值语句,就好像使用了 = 操作符而不是 :=。正确的方式是使用 var abc = 1。尽管在函数内部使用时两者完全一样,但你只能在函数外部使用后一种形式。(有点奇怪,不是吗?)

另一个原因是,如果你仔细看"短变量声明"这个术语,你会发现它是用于声明变量,而不是常量。

到目前为止,你已经习惯了变量可以改变而常量不能改变的概念。换句话说,变量是"可读/写"的,而常量是"只读"的。

这涉及到一个中级主题,你现在不必担心或理解它。当你在 Go Playground 中运行程序时,实际上有两个主要阶段。首先,程序被编译,然后运行编译器生成的可执行文件。

在 Go 中,常量几乎完全由编译器处理,在程序运行时甚至不存在纯粹的形式。例如,

const a = 1
const b = 2
var c = a + b

c 的值由编译器设置为 3,在程序开始运行时已经是 3 了。加法运算由编译器完成,它处理 c 的声明就像

var c = 3

所以值 3 被编码到编译器生成的可执行(可运行)程序中,但 constab 只存在于编译器中。

虽然当你阅读 Go 源代码时,constvar 看起来像是同一种东西,但 Go 编译器和运行时系统对它们的处理方式是不同的。

在Go语言中,变量声明和赋值有明确的语法规则。根据你提供的代码和错误描述,问题在于你在switch语句中使用了短变量声明操作符:=,这是不允许的。

在Go中,:=用于在函数内部声明并初始化变量,但它不能作为表达式的一部分被"用作值"。在switch语句中,你只能使用已经声明过的变量或表达式,而不能在switch关键字后面直接进行变量声明。

以下是修正后的代码:

package main

import "fmt"

func main() {
    // 先声明并初始化变量
    favFood := "Italian"
    
    // 然后在switch语句中使用已声明的变量
    switch favFood {
    case "Japanese":
        fmt.Println("Sushi is the best!")
    case "Italian":
        fmt.Println("Pizza and pasta are great!")
    case "Mexican":
        fmt.Println("Tacos are amazing!")
    default:
        fmt.Println("Every cuisine has its charm!")
    }
}

或者,如果你想要在switch中直接使用值而不是变量,可以这样写:

package main

import "fmt"

func main() {
    // 直接在switch中使用字符串值
    switch "Italian" {
    case "Japanese":
        fmt.Println("Sushi is the best!")
    case "Italian":
        fmt.Println("Pizza and pasta are great!")
    case "Mexican":
        fmt.Println("Tacos are amazing!")
    default:
        fmt.Println("Every cuisine has its charm!")
    }
}

关键区别:

  • favFood := "Italian" 是一个声明语句,不能在需要表达式的地方使用
  • switch语句中,switch后面必须是一个表达式或已声明的变量
  • 短变量声明:=只能在函数内部使用,且每个变量只能声明一次

第一个修正版本是最符合你原始意图的写法。

让我看看能否更好地解释一下 iota。它用于在常量声明块中的 const 声明。首先,这里是一个常量声明块:

const (
    a = 0
    b = 1
    c = 2
)

这没什么特别的。与这个比较一下:

const (
    a = 0
    b = 0
    c = 0
)

它们都被设置为 0。Go 提供了一种更简洁的方式来实现:

const (
    a = 0
    b
    c
)

abc 都设置为 0。现在让我们开始使用 iotaiota 是 Go 中的一个特殊常量,在每次新行使用时(在每个 const 声明内)都会递增。

const (
    a = iota
    b = iota
    c = iota
)

这将 a 设置为 0b 设置为 1c 设置为 2。第一次使用 iota 时,其值为 0,并且每次使用时(在新行上)都会递增。

上面的例子与以下相同:

const (
    a = iota
    b
    c
)

最后一种方式是 iota 非常常见的用法。abc 都被设置为 iota,但每次使用时 iota 的值都会递增。当只有三个常量时,它节省的输入不多,但想象一下如果你有 20 个、100 个,或者为地球上的每个国家都设置一个。它使代码更容易输入和阅读,并可能有助于避免错误。

最后一件事。我说过 iotaconst 声明中的每个新行都会递增。嗯,这并不完全正确。实际上,它在声明中引入的每个新的 ConstSpec 时递增,这可能是一个标识符,或者是一个标识符列表。规范中给出的最后一个 iota 示例展示了这一点。这是一个更高级的用法,你可能暂时不需要担心。

回到顶部