Golang赋值不匹配:声明2个变量却返回3个值?

Golang赋值不匹配:声明2个变量却返回3个值? 我正在尝试创建一个程序,用于打开文件。如果文件中的某行以“1”开头,则调用“func1”;如果以“2”开头,则调用“func2”。但不知为何,我的第一种情况运行正常,而第二种情况却出现了错误。

我遇到的错误是:.\main.go:34:15: assignment mismatch: 2 variables but Package.pack2 returns 3 values

有人能帮我看看吗:

package main

import (
	"bufio"
	//"fmt"
	package "local/package"
	"log"
	"os"
)

func main() {
	file, err := os.Open("file path")

	if err != nil {
		log.Fatalf("failed opening file: %s", err)
	}

	scanner := bufio.NewScanner(file)
	var 0 package.pack1
	var 1 package.pack2
	var 2 package.pack2
	var 3 package.pack2

	for scanner.Scan() {
		line := scanner.Text()
		switch line[0] {
		case '1':
			{
				0, err = package.func1(line)
				log.Fatal("The file has 1", 0)
			}
		case '2':
			{
				1, err = package.func2(line)
				log.Fatal("The file has 2", 1)

				2, err = package.func2(line)
				log.Fatal("The file has 3", 2)

				3, err = package.func2(line)
				log.Fatal("The file has 2", 3)
			}
		}
	}

	file.Close()
}

更多关于Golang赋值不匹配:声明2个变量却返回3个值?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你好,Chris,

我已经将变量改为了字符类型,但仍然遇到相同的错误。我的程序在第一种情况下运行正常,但似乎在第二种情况的某个地方出了错。

谢谢,

更多关于Golang赋值不匹配:声明2个变量却返回3个值?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题是这样的:

func2() 返回三个值,而你只将 func2 的返回值赋给了两个变量。func2 期望三个变量。

如果你能提供 func2 的定义,我们可以指出具体发生问题的位置,但从长远来看,按照上面 Jakob 的建议,学习 Go 教程可能会更有帮助。

你好!

你的程序有很多奇怪的地方,以至于我认为你引用的错误可能只是你所有问题中最小的一个。😊 你试过Go语言之旅来扎实掌握基础知识吗?

之后,我建议从一个更小的程序开始,这个程序只实现你期望解决的问题中的某个部分,而不是全部——也许可以先尝试打开和关闭一个文件,并确保没有错误。一旦这步成功了,再从文件中读取一行并打印出来。这步成功后,再尝试获取该行的第一个字符。依此类推,每次只迭代解决一个子问题。

不能使用数字作为变量名。以下是无效的Go代码:

var 0 package.pack1 
var 1 package.pack2
var 2 package.pack2
var 3 package.pack2

编译器应该已经对这些代码报告了错误。 请改用以下方式:

var v0 package.pack1 
var v1 package.pack2
var v2 package.pack2
var v3 package.pack2

在你的程序中,将所有的 0 替换为 v01 替换为 v1,依此类推。

错误信息非常明确。func2() 返回三个值,而你试图将 func2 的返回值赋给两个变量。func2 期望接收三个变量。

这个错误是因为package.func2返回了3个值,但你只用了2个变量来接收。在Go中,函数可以返回多个值,赋值时变量数量必须与返回值数量匹配。

查看你的代码,package.func2明显返回3个值,但你在赋值时只用了2个变量。以下是修复后的代码:

package main

import (
	"bufio"
	pkg "local/package" // 给包起个别名,避免使用保留字"package"
	"log"
	"os"
)

func main() {
	file, err := os.Open("file path")
	if err != nil {
		log.Fatalf("failed opening file: %s", err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	var result0 pkg.pack1
	var result1, result2, result3 pkg.pack2 // 使用有效的变量名

	for scanner.Scan() {
		line := scanner.Text()
		if len(line) == 0 {
			continue
		}
		
		switch line[0] {
		case '1':
			result0, err = pkg.func1(line)
			if err != nil {
				log.Fatal("Error in func1:", err)
			}
			log.Println("The file has 1", result0)
			
		case '2':
			// func2返回3个值,需要用3个变量接收
			var1, var2, var3 := pkg.func2(line)
			log.Println("The file has 2", var1, var2, var3)
			
			// 或者如果你不需要所有返回值,可以用下划线忽略
			result1, _, _ = pkg.func2(line)
			log.Println("The file has 3", result1)
			
			_, result2, result3 = pkg.func2(line)
			log.Println("The file has 2", result2, result3)
		}
	}
	
	if err := scanner.Err(); err != nil {
		log.Fatal("Scanner error:", err)
	}
}

主要修改:

  1. 修复了变量名(Go变量名不能以数字开头)
  2. 正确处理func2的3个返回值
  3. 添加了错误处理和边界检查
  4. 使用defer确保文件关闭
  5. 修复了包导入的命名冲突

你需要根据func2实际返回的3个值的类型来调整变量声明。如果不需要某些返回值,可以使用下划线_忽略它们。

回到顶部