声明的返回值类型和实际的返回值类型不一致怎么也不报错呢?

声明的返回值类型和实际的返回值类型不一致怎么也不报错呢?

copy定义的返回值是(w int64, err error)。在代码执行结束的时候直接return。并没有按照定义的返回。程序也没报错,这是我疑惑的地方

package main

import (
    "io"
    "os"
)

func main() {
    copy("6.go","aaa.go")
}
func copy(src, dst string) (w int64, err error) {
    // 打开文件
    file, err := os.Open(src)
    if err != nil {
        panic(err)
        return
    }
    defer file.Close()

    file1, err1 := os.Create(dst)
    if err1 != nil {
        panic(err)
        return
    }
    defer file1.Close()
    io.Copy(file1, file)
    return
}
阅读 3.9k
4 个回答

Return Statement

The expression list may be empty if the function's result type specifies names for its result parameters. The result parameters act as ordinary local variables and the function may assign values to them as necessary. The "return" statement returns the values of these variables.

如果返回值都有名字的话,return 后面的可以什么都没有。

==================================================

不是因为返回值没写,而是因为 panic 之后的代码是执行不到的。

package main

import "fmt"

func main() {
    name,age:=aa()
    fmt.Println(name,age)

    a:=bb()
    fmt.Print(a)
}
//return后面什么都不写,可以叫做隐式返回值吗?
//return "xiaolan",18 显式返回值吗?
func aa() (name string, age int) {
    name = "thomas"
    age=23;
    return
    //return "xiaolan",18
}
func bb() (a int){
    a=1
    return
}
//如果返回定义的变量名称和方法内部定义的变量名称一样的话,
// 不用显式return。只写一个return就可以

因为你已经给返回值定义了啊
如果:

func aa() (string, int) {
    name := "thomas"
    age :=23
    return
    //return "xiaolan",18
}

就会报错

新手上路,请多包涵

命名返回值,相当于初始化了,是相应类型的零值,你直接return后返回的就是对应的返回值。
即刚开始的时候w的值是0err的值是nil
返回值有值,所以不会报错。
我觉得是这么理解的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏