英文:
How to declare to variables of different datatypes in a single statement in Go
问题
我想在Go语言中的单个语句中声明两个不同数据类型(string
和error
)的变量。我不想使用短声明(:=
)运算符,因为我喜欢在声明时指定变量的类型。
我正在按照Go文档中的教程进行操作。我有一个名为greetings.Hello()
的函数,我正在从另一个模块中调用该函数。greetings.Hello()
函数的代码如下所示:
package greetings
import (
"errors"
"fmt"
)
func Hello(name string) (string, error) {
// 如果没有提供名字,返回一个带有错误信息的错误
if name == "" {
return "", errors.New("empty name")
}
// 如果收到了名字,返回一个值
var message string = fmt.Sprintf("Welcome %v!", name)
return message, nil
}
所以你可以看到,这个函数返回两个值(一个string
和一个error
)。因此,我需要在调用者中将这个函数的结果赋值给两个变量。我从名为hello
的模块中调用greetings.Hello()
函数。hello
模块的主包的main
函数如下所示:
package main
import (
"fmt"
"log"
"creating_modules/greetings"
)
func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)
var message string, err error = greetings.Hello("")
if err != nil {
log.Fatal(err)
}
fmt.Println(message)
}
creating_modules/greetings
是包含Hello()
函数的greetings模块。大多数Gopher会这样处理:
message, error := greetings.Hello()
但是我想在单个语句中声明变量及其数据类型。而且这两个变量应该被赋予greetings.Hello()
的返回值。上述hello
模块的main
函数在运行时会返回一个错误,因为赋值不正确,具体是这一行:
var message string, err error = greetings.Hello("")
当使用go run
运行此代码时,Go编译器会返回以下错误:
.\hello.go:14:20: syntax error: unexpected comma at end of statement
可以通过复制粘贴上述代码来简单地复现此问题(请注意,greetings
模块是一个本地模块,因此您需要使用go edit -replace
设置go工具的引用路径)。
还需要注意的是,我的问题与这个问题不同,因为那个问题是关于在单个语句中声明具有相同数据类型的变量,而我的问题是关于在单个语句中声明具有不同数据类型的多个变量。
附注:我不会对Golang没有这个特性感到惊讶。
英文:
I want to declare two variables of different datatypes(string
and error
) in a single statement in Go. I do not want to use the short declaration(:=
) operator because I like specifying the type of the variable at declaration.
I am following a Go tutorial from the Go docs. I have a function called greetings.Hello()
that I am calling from another module. The greetings.Hello()
function looks like this:
package greetings
import (
"errors"
"fmt"
)
func Hello(name string) (string, error) {
// If no name was given, return an error with a message
if name == "" {
return "", errors.New("empty name")
}
// If a name was received, return a value
var message string = fmt.Sprintf("Welcome %v!", name)
return message, nil
}
So as you can see, this function returns two values(a string
and an error
). So ultimately, I would have to assign the result of this function to two variables in the caller. I am calling the greetings.Hello()
function from a module named hello
. The main function of the hello
module's main package looks like this:
package main
import (
"fmt"
"log"
"creating_modules/greetings"
)
func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)
var message string, err error = greetings.Hello("")
if err !=nil {
log.Fatal(err)
}
fmt.Println(message)
}
The creating_modules/greetings
is the greetings module that contains the function Hello()
. Most of the gophers tackle it like this:
message, error := greetings.Hello()
But I want to declare the variables along with their datatypes in a single statement. Also the two variables should be assigned the return values of greetings.Hello()
. The above mentioned main function of the hello
module returns an error when it is run because of the incorrect assignment, referring to this line:
var message string, err error = greetings.Hello("")
The Go compiler returns this error when this code is run using go run
:
.\hello.go:14:20: syntax error: unexpected comma at end of statement
This issue can simply be reproduced by copy-pasting the code above(note that the greetings
module is a local module so you will need to set the reference path for go tools using go edit -replace
)
Another thing to be noted is that my question is different from this question because that question is about declaring variables with the same data type in a single statement whereas mine is about declaring multiple variables with different data types in a single statement.
P.S i won't be surprised to know that Golang does not have this feature
答案1
得分: 5
在单个语句中声明变量及其数据类型是不可能的。
根据语言规范中的支持性条款变量声明:
如果指定了类型,每个变量都将具有该类型。否则,每个变量将具有赋值语句中相应初始化值的类型。如果该值是无类型常量,则首先将其隐式转换为其默认类型。
因此,可以使用以下类似的方式,不指定任何类型,但你也可以使用使用:=
进行短变量声明:
var message, error = greetings.Hello()
但你可以显式地声明变量及其类型信息,并使用=
进行赋值。
var message string
var err error
if message, err = greetings.Hello(""); err != nil {
log.Fatal(err)
}
英文:
> declare the variables along with their datatypes in a single statement
Not possible
Supporting clause from the language spec under Variable declarations
> If a type is present, each variable is given that type. Otherwise, each variable is given the type of the corresponding initialization value in the assignment. If that value is an untyped constant, it is first implicitly converted to its default type;
So something like below could work by not specifying either of the types, but you could very well use short variable declarations using :=
instead
var message, error = greetings.Hello()
But you can declare the variables explicitly with their type information and use the =
assignment.
var message string
var err error
if message, err = greetings.Hello(""); err != nil {
log.Fatal(err)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论