如何使用Go语言中的普通的函数

普通函数

在 Go 语言中普通函数的定义格式为 func [函数名](入参)(出参),如下:

func callFuncA(x, y string) (s string, err error) {  return x + y, nil }  func main() {  callFuncA("炸", "煎鱼") }

在示例代码中声明了一个函数名为 callFuncA 的方法,他只允许在包内调用,因此首字母为小写。

其具有两个入参,分别是 x 和 y,类型都为 string。而出参为变量 s 和 err,类型分别为 string 和 error。

另外在函数体内返回值时,也可以采用快捷返回的方式:

func callFuncA(x, y string) (s string, err error) {  s = x + y  return }

在出参时所声明的变量名称,是可以应用到自身函数的。因此若直接执行 return 则会隐式返回已经声明的出参变量。

在函数定义时,其入参还支持可变参数的语法:

func callFuncA(x ...string) (s string, err error) {  s = strings.Join(x, ",")  return }  func main() {  fmt.Println(callFuncA("炸", "煎鱼")) }

在入参变量上声明为 x …string,则表示变量 x 是 string 类型的可变变量,能够在入参时传入多个 string 参数。

可变变量所传入的格式为切片(slice)类型,该类型我们会在后面的章节进行讲解,你可以理解为不受长度限制的动态数组:

[0: 炸 1: 煎鱼]

一般对可变变量的常见后续操作多是循环遍历处理,又或是进行拼接等操作。

匿名函数

Go 语言也默认支持匿名函数的声明,声明的方式与普通函数几乎一样:

func main() {  s := func(x, y string) (s string, err error) {   return x + y, nil  }   s("炸", "煎鱼") }

匿名函数可以在任意地方声明,且不需要定义函数名,如果在函数体后马上跟 () 则表示声明后立即执行:

func main() {  s, _ := func(x, y string) (s string, err error) {   return x + y, nil  }("炸", "煎鱼") }

而在所有的函数类使用中,有一点非常重要,那就是函数变量作用域的理解:

func main() {  x, y := "炸", "煎鱼"  s, _ := func() (s string, err error) {   return x + y, nil  }()  fmt.Println(s) }

该匿名函数没有形参,函数内部没有定义相应的变量,此时其读取的是全局的 x、y 变量的值,输出结果是 “炸煎鱼”。

func main() {  x, y := "炸", "煎鱼"  _, _ = func(x, y string) (s string, err error) {   x = "吃"   return x + y, nil  }(x, y)  fmt.Println(x, y) }

该匿名函数有形参,但是在函数内部又重新赋值了变量 x。那么最终外部所输出的变量 x 的值是什么呢?输出结果是 “炸 煎鱼”。

为什么明明在函数内已经对变量 x 重新赋值,却依然没有改变全局变量 x 的值呢?

其本质原因是作用域不同,函数内部所修改的变量 x 是函数内的局部变量。而外部的是全局的变量,所归属的作用域不同。

结构方法

在结合结构体(struct)的方式下,可以声明归属于该结构体下的方法:

type T struct{}  func NewT() *T {  return &T{} }  func (t *T) callFuncA(x, y string) (s string, err error) {  return x + y, nil }  func main() {  NewT().callFuncA("炸", "煎鱼") }

具体的函数的使用方法与普通函数一样,无其他区别。

而与结构体有关的值传递、引用传递的方法调用将在具体后面的章节再展开。

内置函数

Go 语言本身有支持一些内置函数,这些内置函数的调用不需要引用第三方标准库。内置函数的作用是用于配合 Go 语言的常规使用,数量非常少。如下:

  • 用于获取某些类型的长度和容量:len、cap。

  • 用于创建并分配某些类型的内存:new、make。

  • 用于错误处理机制(异常恐慌、异常捕获):panic、recover。

  • 用于复制和新增切片(slice):copy、append。

  • 用于简单输出信息:print、println。

  • 用于处理复数:complex、real、imag。

针对每个内置函数的真实使用场景,我们会在后续的章节再进一步展开,因为每个内置函数本质上都对应着各类型的使用场景。

原创文章,作者:HHSBK,如若转载,请注明出处:https://www.beidanyezhu.com/a/29162.html

(0)
HHSBK的头像HHSBK
上一篇 2025-02-05
下一篇 2025-02-05

相关推荐

  • Go语言与鸭子类型的关系是什么

    Go语言与鸭子类型的关系   先直接来看维基百科里的定义:   If it looks like a duck, swims like a duck, and quacks lik…

  • Go语言的重要性

    一、Go 开发者 数量 & 所处地区 全球大约有 110 万名职业 Go 开发者(特指在工作中专门将 Go 作为主力编程语言的群体),如果把主要使用其他编程语言但同时兼职使…

    2025-02-05
  • Go语言中CGO怎么用

    1. Go语言调用C函数例子: package main   // // 引用的C头文件需要在注释中声明,紧接着注释需要有import &q…

    2025-02-05
  • Go语言能否取代Linux脚本

      在Cloudflare的人们都非常喜欢Go语言。我们在许多内部软件项目以及更大的管道系统中使用它。但是,我们能否进入下一个层次并将其用作我们最喜欢的操作系统Linux的脚本语言…

  • 什么是Go语言的字符串

      一个Go语言字符串是一个任意字节的常量序列。 Go语言字符串与其他语言不同点   Go语言字符串与其他语言(Java,C,Python)字符串的不同点Go语言中字符串的字节使用…

  • 为什么Go语言能够成功

      常言道,历史不会重演,但总会惊人的相似。   如果您想创建一种编程语言,多向那些有经验的人士学习,他们有很多可取之处。在《GoTime》第100期节目中,两位Go语言的创造者R…

  • go语言中函数与方法是什么

      如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的。   package math   func Sin(x float64) float //implemented …

  • GO语言的类型有哪些

    1、值的类型给编译器提供两部分信息:一是,需要分配多少内存给这个值(即值的规模);二是这段内存表示什么。 2、用户自定义类型有两种方法。一是使用关键字 struct ,来创建一个结…

    2025-02-05
  • 如何安装和使用Go语言集成开发环境的VS Code

    目录 Go语言集成开发环境之VS Code安装使用 下载与安装 安装中文简体插件 安装Go开发扩展 变更编辑器主题 安装Go语言开发工具包 配置VSCode开启自动保存 配置代码片…

    2025-02-05
  • Go语言的接口的介绍以及作用是什么

    接口就是一系列方法的集合(规范行为) 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。 在 Go 语言中的接口是非侵入式接口(接口没了,不影响代码…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部