Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.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:为新变量和旧变量分配多个返回值函数_Go - Fatal编程技术网

Go:为新变量和旧变量分配多个返回值函数

Go:为新变量和旧变量分配多个返回值函数,go,Go,在go中,有些函数返回两个或多个值,通常其中一个是错误。假设我想将第一个返回值存储到一个已经初始化的变量中,但我想初始化该变量以内联包含错误。有办法做到这一点吗 例如,假设我有这个代码 var a int //This code doesn't compile because err doesn't exist a, err = SomeFuncWithTwoReturnValues() //This code doesn't compile either a, err := SomeFuncW

在go中,有些函数返回两个或多个值,通常其中一个是错误。假设我想将第一个返回值存储到一个已经初始化的变量中,但我想初始化该变量以内联包含错误。有办法做到这一点吗

例如,假设我有这个代码

var a int
//This code doesn't compile because err doesn't exist
a, err = SomeFuncWithTwoReturnValues()
//This code doesn't compile either
a, err := SomeFuncWithTwoReturnValues()
我知道你可以做到,但我希望有一种方法可以做到这一切

var a int
var err error
a, err = SomeFuncWithTwoReturnValues()

编辑:上面的代码实际上是编译的,所以我回顾了我的代码,进一步深入研究,并创建了一个快速示例,实际复制了问题(不仅仅是在我的脑海中…)


编译器在:=左侧显示
main.go | 9 |非名称a[0]。如果我将它改为
=
,而不是
:=
,那么b永远不会被创建。但是我觉得没有简写的方法可以做到这一点。

正如您在评论中提到的,您需要使用
=
运算符来分配给您已经声明的变量。
:=
运算符用于同时声明和分配变量。两者是相同的:

var x int
x = 5
//is the same as
x := 5
此解决方案将至少编译:

package main

func myfunc() (int, int) {
    return 1, 1
}

func main() {
    var b int
    a := make([]int, 1)
    a[0], b = myfunc()
    a[0] = b
}
为了回答您的问题,我认为在返回多个值时,没有一种方法可以同时使用未声明的变量和声明的变量。这将是试图同时使用两个不同的操作符


编辑:刚刚从编译的代码中看到了您的示例,因此您似乎已经熟悉go的赋值运算符。无论如何,我将把这个例子留给大家。

Golang不是一种非常一致的语言。这是一个很好的例子。一开始我很困惑,如果他们总是允许
:=
操作符,那就简单多了。编译器足够智能,可以检测已声明的变量:

主程序包
输入“fmt”
func testFunc()(int,错误){
返回42,fmt.Errorf(“测试错误”)
}
func main(){
number1,err:=testFunc()//确定
number2,err:=testFunc()//确定,即使已经定义了err
number1,err=testFunc()//确定
//number1,err:=testFunc()//错误:左侧没有新变量:=
fmt.Println(编号1,编号2,错误)
}
游乐场连接:


这是不一致的,因为golang允许您对已经声明的变量使用
:=
,如果您在为它们赋值的同时引入新变量。因此编译器可以检测到变量已经存在并跳过它们的声明。但golang开发者决定,只有在引入至少一个新值的情况下才允许这样做。最后一个示例显示。

我遇到了这样的情况:

package main
import "os"

func main() {
   var cache struct { dir string }
   // undefined: err
   cache.dir, err = os.UserCacheDir()
   // non-name cache.dir on left side of :=
   cache.dir, err := os.UserCacheDir()
   if err != nil {
      panic(err)
   }
   println(cache.dir)
}
正如您所发现的,这个问题没有一个干净的解决方案。你可以申报 一个额外的变量:

dir, err := os.UserCacheDir()
if err != nil {
   panic(err)
}
cache := userCache{dir}
或者,虽然更详细,但您可以事先声明错误。这可以节省开支 内存(as Go)不使用锈迹所有权模型:

var (
   cache struct { dir string }
   err error
)
cache.dir, err = os.UserCacheDir()

您提供的第二个示例实际上应该有效。编译器是怎么说的?没错,我在一个稍微复杂一点的问题中遇到了一个编译错误,所以在飞行中被转录成了一个简单的问题。我要仔细看看我是否遗漏了什么添加了另一个代码示例,它实际上更接近于复制情况变量应该是
err
,类型为error。不要称之为错误。不过,在注释中插入换行符是很困难的。可以肯定的是,在玩游戏的基础上/comments只需声明变量,在处理数组时,没有使用“=运算符”的“快捷方式”即可。有更新吗?在赋值中同时使用未声明变量和声明变量。
dir, err := os.UserCacheDir()
if err != nil {
   panic(err)
}
cache := userCache{dir}
var (
   cache struct { dir string }
   err error
)
cache.dir, err = os.UserCacheDir()