Golang函数语法详解及实战示例分享

Golang函数语法详解及实战示例分享 https://play.golang.org/p/Ou7esJnAkv

在这段代码中,有人可以告诉我: 什么是(r 接收器) 什么是标识符(参数)(返回){ … } 什么是(参数) 什么是(返回)

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

非常有趣。谢谢!

更多关于Golang函数语法详解及实战示例分享的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我忘记提了,感谢关于返回值的说明。非常有帮助。

这个链接中,是否必须使用"return"关键字才能实现返回,还是有其他方式可以实现这个功能?

https://play.golang.org/p/dpINmrlSsQ 中 “James” 是参数吗? 还有其他参数吗?

cherilexvold1974:

当你定义一个函数时,它被称为参数 我们将传入一个实参:bar(James)

是的,参数和实参之间确实存在区别,但这种区别…嗯…根据不同的资料来源,这些词语的用法正如你这里所描述的,而在其他资料中它们又被互换使用。

甚至我的教授都没有区分这两者,因为他认为这样做反而比不区分更令人困惑,而且通常从上下文就能清楚你是在讨论函数定义中的还是函数调用中的。

因此我将这些词视为同义词使用。

不过,如果我们应用你上面的定义,那么在

func foo(bar string) {
  fmt.Println(bar)
}

中,第一行的barfoo的参数,而第二行的barfmt.Println的调用中作为实参使用。

根据你的定义,参数永远不能拥有具体值。

NobbZ:

它被注释掉了

我不明白这是什么意思。

我在代码中看到的唯一参数是 "hello from foo"
谢谢,这很有帮助。

是的,你应该能够自己识别它们。

我正在尝试区分参数和实参。以下是我获得的一些信息:

了解参数和实参之间的区别

  • 我们使用参数(如果有的话)来定义函数
  • 我们调用函数并传入实参(如果有的话)

调用:指定我传入多少个实参
当你定义一个函数时,它被称为参数
我们将传入一个实参:bar(James)

根据我有限的理解,似乎
“func foo() {
fmt.Println(“hello from foo”)”

是在定义函数。所以你刚才帮我确认了,(“hello from foo”) 是一个参数;

而 “James” 是一个实参,因为"我们调用函数并传入实参"。

所以我不知道还有其他什么实参。

其中一些我是通过推理得出的,因为我对"传入"和"调用"没有明确的定义。
我研究了语言规范中的说明,但其中大部分内容超出了我的理解范围。不过只要时间允许,我仍然会研究它,这确实对我有帮助

cherilexvold1974:

What is the (r receiver)

它被注释掉了,因此在那段代码中除了空白什么都不是。

cherilexvold1974:

What is the identifier(parameters) (return(s)) { … }

任何命名事物的都是标识符。

L1: main
L7: main
L13: foo
L14: fmt, Println

cherilexvold1974:

What are the (parameters)

我在代码中看到的唯一参数是 "hello from foo"

cherilexvold1974:

What are the(return(s))

代码中没有函数返回任何内容。

cherilexvold1974:

is “James” the argument?

是的,"James" 是第9行调用的函数 bar 的参数。

cherilexvold1974:

Are there others?

是的。你应该能够自己识别它们。

cherilexvold1974:

do you have to use the word “return” in order for there to be a return

是的

cherilexvold1974:

or are there other ways to make that happen?

在 Go 语言中没有。

在Go语言中,函数定义的基本语法是:func (接收器) 函数名(参数列表) (返回值列表) { 函数体 }。下面针对您的代码片段和问题详细解释:

1. 接收器 (r Receiver)

接收器用于定义方法(method),让函数与特定类型关联。在您的代码中,main函数没有接收器,因为它是一个独立的函数。

示例:

type Rectangle struct {
    width, height float64
}

// 方法:area 有接收器 (r Rectangle)
func (r Rectangle) area() float64 {
    return r.width * r.height
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println(rect.area()) // 输出: 50
}

2. 标识符 (函数名) 和参数列表

  • 标识符:函数名称,如 main
  • 参数列表:函数接收的输入参数,用括号包围

示例:

// add 是函数名,a int 和 b int 是参数列表
func add(a int, b int) int {
    return a + b
}

func main() {
    result := add(3, 5)
    fmt.Println(result) // 输出: 8
}

3. 参数 (Parameters)

参数定义函数接收的输入变量及其类型。

示例:

// name string 是参数
func greet(name string) {
    fmt.Println("Hello,", name)
}

// 多个参数
func calculate(x, y int, operation string) int {
    if operation == "add" {
        return x + y
    }
    return x - y
}

func main() {
    greet("Alice")                    // 输出: Hello, Alice
    fmt.Println(calculate(10, 3, "add")) // 输出: 13
}

4. 返回值 (Return Values)

返回值定义函数输出结果的类型。

示例:

// 单个返回值
func multiply(a, b int) int {
    return a * b
}

// 多个返回值
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}

// 命名返回值
func getCoordinates() (x, y int) {
    x = 10
    y = 20
    return // 自动返回 x 和 y
}

func main() {
    product := multiply(4, 5)
    fmt.Println(product) // 输出: 20
    
    result, err := divide(10.0, 2.0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println(result) // 输出: 5
    }
    
    x, y := getCoordinates()
    fmt.Printf("x=%d, y=%d\n", x, y) // 输出: x=10, y=20
}

您的代码分析

在您的 main 函数中:

func main() {
    fmt.Println("hello world")
}
  • 没有接收器(因为 main 是特殊函数)
  • 函数名:main
  • 参数列表:空 ()(无参数)
  • 返回值:无(隐式)
  • 函数体:调用 fmt.Println 输出 “hello world”

这是Go程序的入口点,当程序运行时自动执行。

回到顶部