3.1go语言中的函数与方法(代码片段)

孙琦Ray 孙琦Ray     2022-11-29     799

关键词:

函数定义语法

与大部分语言一致,Go语言中的函数定义与其他语言基本一致

func function_name(Parameter-list) 
    // function body...


func function_name(Parameter-list) Return-Type 
    // function body...


func function_name(Parameter-list) (Multiple Return-Types)
    // function body..

  • func: 函数定义关键字
  • function_name: 函数名称,Go语言主要使用camel-case(驼峰)命名的方式,还根据函数的性质,用首字母大小写区分作用,具体会在后面专门的章节讲解Go语言的规范
  • Parameter-list: 参数列表,如果没有可以忽略
  • Return-Type/Multiple Return-Types: 返回值的类型,即return返回值的类型,这里特别将三种形式进行了区分:
    • 无返回值/单一返回值/多返回值
    • 另外两种的细小的区别在于括号的使用,单一返回类型一般不再添加括号,而多返回值则需要添加括号
    • 另外为了美观,参数列表后面的括号,建议与返回类型之间有一个空格

函数定义示例

无返回值函数

func HelloFunc() 
    fmt.Println("Hello, World")

单一返回值函数

本示例中演示了参数定义方法和返回值类型定义方法

func HelloFunc(msg string) string 
    return "Hello, " + msg

多返回值函数

第二个返回值的类型通常用于回传错误,这样方便程序进行异常处理

func HelloFunc(msg string) (string, error) 
    return "Hello, " + msg, nil

我们再来看一下完整的代码实现,主函数中调用HelloFunc时,也需要两个变量接收相应的值

package main

import "fmt"

func HelloFunc(msg string) (string, error) 
    return "Hello, " + msg, nil


func main() 
    printString, err := HelloFunc("World")
    if err == nil 
        fmt.Println(printString)
    

方法(Method)定义

Go语言中并没有类,所以在Go语言中提供了一种类似函数定义的方法定义,通过在函数名称前增加Reciever类型,实现一种类似类中方法的定义,方法可以使用Reciver的属性。我们来看一下语法:

func (Reciever-Name Type) function_name(Parameter-list) (Multiple Return-Types)
    // function body..

由于大部分定义内容与上述函数定义相同,这里就不再赘述,只介绍一下新增的部分:

  • Reciever-Name:类型必须是自定义类型,不能是内置的int, string等,使用的话,在编译阶段就会报错

方法(Method)示例

基本类型

我们来看一个通过基本类型实现的方法,这里使用到了一个未曾学习到的知识点——自定义类型type,后面还会详细讲解,不用在此处纠结。这句含义就是通过自定义类型mystring再次定义的变量,本质上与string同一类型。

type mystring string

这里注意我们的函数定义,在函数名前,多了(msg mystring)的定义,而在函数体内,我们也可以直接使用msg

func (msg mystring) HelloFunc() 
    str := "Hello, " + msg
    fmt.Println(str)

而在main函数中进行调用时,与上面的函数调用不同,我们直接使用调用mymsg的方法HelloFunc,实现了与上面例子类似的方法

var mymsg mystring
mymsg = "World"
mymsg.HelloFunc()

完整代码如下所示

package main

import "fmt"

type mystring string

func (msg mystring) HelloFunc() 
    str := "Hello, " + msg
    fmt.Println(str)


func main() 
    var mymsg mystring
    mymsg = "World"
    mymsg.HelloFunc()

结构体类型

其实从各个项目的源代码来看,方法还是更多的与结构体(struct)和接口(interface)一起使用,这些都会在后面进行详细讲解,这里只需要了解即可。这里介绍一个简单的例子,我们来计算长方形的面积。

  • 定义了一个结构体rect,其中包含长和宽两个属性
  • 计算面积的方法area(),Reciver定义为结构体类型,这样方法体内,就可以使用长和宽计算面积
  • 主函数中,定义了一个结构体,并且初始化长和宽分别为3和4
  • 调用自定义结构体的r.area()完成面积计算
package main

import "fmt"

type rect struct 
    width float64
    height float64


func (r rect) area() float64 
    return r.width * r.height


func main() 
    r := rect3, 4
    rectArea := r.area()
    fmt.Printf("Rect area is %v\\n", rectArea)

go方法和接口(代码片段)

方法Go语言中的方法其实就是一个特殊函数,只不过这个函数是和某种属性类型绑定在一起的而已Go语言中的方法一般用于将函数和结构体绑定在一起,让结构体除了能够保存数据外还能具备某些行为将函数和数据类型绑定的格式只... 查看详情

go语言中的闭包(代码片段)

基本概念闭包:函数+该函数使用到的变量共同组成了闭包实现方式通过函数返回函数的方法实现外层函数实现变量控制内层函数实现逻辑控制案例实践 实现代码闭包法packagemainimport( "fmt" "strings")funcmakeSuffix(suf... 查看详情

go语言基础(代码片段)

go语言基础(一)packagepackage调用Go程序是通过package来组织的。只有package名称为main的源码文件可以包含main函数。个可执行程序有且仅有一个main包。通过import关键字来导入其他非main包。可以通过import关键字单个导入:import"fmt&q... 查看详情

理解go语言中的方法和接收者(代码片段)

Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者self。方法的定义格式如下:func(接收者变量接收者类型)方法... 查看详情

go语言之method(代码片段)

方法methodGo中虽没有class,但依旧有method通过显示说明receiver来实现与某个类型的组合只能为同一个包中的类型定义方法receiver可以是类型的值或指针不存在方法重载可以使用值或者指针来调用方法,编译器会自动完成转换从某种意... 查看详情

7.3go语言中通过waitgroup控制并发(代码片段)

...发,但是在开发习惯上与显示的表达不太相同,所以在Go语言中可以利用sync包中的WaitGroup实现并发控制,更加直观。基本使用示例我们将之前的示例加以改造,引入sync.WaitGroup来实现并发控制。首先我们在主函数中定义WaitGroupvarw... 查看详情

带你了解—方法(代码片段)

目录1、Go函数方法定义1、Go函数方法定义在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说,函数就是方法,方法就是函数,但是在Go语言中,函数是指不属于任何结构体、类型的方法,也... 查看详情

7.1go语言中什么是goroutines(代码片段)

...theGoruntime)。为什么没有采用现有的表示并发名词来解释Go语言中的并发呢?因为现有的线程、协程、进程等都无法准确表达Goroutine。Goroutines使用方法函数并发执行与普通函数类似,我们调用Goroutines时只需要在函数前加上go关键 查看详情

golang学习五·五:指针&切片&字典&结构体(代码片段)

文章目录一、指针:1.Go语言中的指针:2.栈帧:2.1计算机内存区域划分:2.2栈帧:3.函数new4.指针作为函数参数:4.1函数传值:4.2例:4.指针使用注意:二、slice--切片:1.切片简述:2.创建slice:2.1声明slice与array的区别:2.2经常使用的创建slice的... 查看详情

gotour(代码片段)

...io.Reader接口图像接口并发Go程信道本篇内容多数来自于Go语言之旅中文教程。基础包、变量、函数包、导入每个go程序都被包括在一个包中。这个包在程序始以packagepackname确定。程序从main包开始运行。通过import语句可以导入使用... 查看详情

go语言函数语法下篇(代码片段)

...迟执行语句defer1.1defer概念1.2使用演示二、递归函数三、Go语言处理运行时错误3.1错误处理思想3.2错误接口的定义四、Go语言宕机五、Go语言宕机恢复recover5.1基础概念5.2让程序在崩溃时继续执行5.3panic和recover的关系六、计算函数执... 查看详情

go语言语法笔记(代码片段)

文章目录前言基础语法数据类型变量与常量算术与赋值运算符流程控制语句比较与逻辑运算符函数更多数据类型指针(pointer)结构体(struct)数组(array)切片(slice)映射(map)泛型(... 查看详情

3.2go语言中的匿名函数(代码片段)

Go不允许函数嵌套,但是可以定义匿名函数,后续配合Goroutine的使用,很轻松的构建并发程序。语法定义匿名函数一般是在函数体内的独立逻辑,与函数定义类似,但是由于其特殊位置,在使用时需要注意&... 查看详情

go语言中的函数(代码片段)

...递数据,返回值,函数将处理好的数据传递给调用者。Go语言中函数被称为一等公民(first-class)。意味着支持高阶函数,支持匿名函数,支持闭包等特性,可以满足接口等高级函数特性。2定义语法:定义:func函数名( 查看详情

go语言基础:map|函数(代码片段)

文章目录mapmap的定义map使用判断某个键是否存在map的遍历使用delete函数删除键值对特定的顺序遍历map元素是map类型的切片元素类型是切片的map练习函数函数定义函数的调用参数类型的简写可变参数返回值多返回值返回值命名返回... 查看详情

go语言基础:map|函数(代码片段)

文章目录mapmap的定义map使用判断某个键是否存在map的遍历使用delete函数删除键值对特定的顺序遍历map元素是map类型的切片元素类型是切片的map练习函数函数定义函数的调用参数类型的简写可变参数返回值多返回值返回值命名返回... 查看详情

go基础之函数方法接口包(代码片段)

Go基础(二)之函数、方法、接口、包一、函数1.1函数参数1.2返回值1.3匿名函数1.4延迟处理defer1.5错误处理1.6内置函数1.7常用的相关函数二、方法2.1方法简介2.2通过方法封装三、接口3.1接口简介3.2类型转换四、包的基本概... 查看详情

[go]接口的运用(代码片段)

  在Go语言中,不能通过调用new函数或make函数创建初一个接口类型的值,也无法用字面量来表示一个接口类型的值。可以通过关键字type和interface声明接口类型,接口类型的类型字面量与结构体类型有些相似,不过结构体类型... 查看详情