title: CRUD Boy 之 Golang函数
author: Mood
tags:
- 'CRUD Boy '
categories: - Golang函数
date: 2019-04-14 21:24:00
接上一篇Golang入坑,了解基本的关键字用法之后,我们上手Golang中的函数。所有的语言都支持函数,无论面向对象还是面向过程的语言,函数对功能可以做轻度抽象,处理好入参和返回值即可,内部实现对调用可以无感知,可以把不同的逻辑黏合起来。GoLang很多特性都是基于函数来搞得命名类型本质就是一个函数。Go中的函数是一种类型,可以和其他类型变量一样使用,可以作为参数,返回值,或者直接调用。直接调用可以多值返回,支持闭包。
基本概念
func functionName(param ParamType) (result ResultType){
//functionBody
return ;
}
函数的定义: 被func关键字声明,有函数名,参数,返回值,函数体,函数名的命名规则符合标识符命名规则,首字母的大小写决定了该函数在其他包的可见性,demo参见CRUD Boy 之 Golang入坑中的GoDemo。go支持有名返回值,这样的话result
在方法调用开始的时候会被初始化为默认值。如果就是用该值进行返回的话,在返回的时候可以不用指定变量。如果说不是使用该值的话,就需要显示指定返回的变量。
func functionName(param ParamType) (result ResultType){
//functionBody
result := param * 2;
return result;
}
go不和php一样支持默认值参数,也不和java一样支持方法重载,对于函数嵌套放在命名函数中再说。说下多值返回。很显然可以知道输出35,20,那么其究竟是如何实现呢。通过其生成的汇编信息研究
package main
import (
"fmt"
)
func main() {
x,y:=swap(20,35);
fmt.Println(x)
fmt.Println(y);
}
func swap(a,b int) (int,int){
return b,a;
}
由于在windows平台,不指定goos和goarch
go tool compile -S -N -L hello.go
可以查看swap方法的汇编信息如下
"".swap STEXT nosplit size=39 args=0x20 locals=0x0
0x0000 00000 (hello.go:53) TEXT "".swap(SB), NOSPLIT|ABIInternal, $0-32
0x0000 00000 (hello.go:53) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (hello.go:53) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (hello.go:53) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (hello.go:53) PCDATA $2, $0
0x0000 00000 (hello.go:53) PCDATA $0, $0
0x0000 00000 (hello.go:53) MOVQ $0, "".~r2+24(SP)
0x0009 00009 (hello.go:53) MOVQ $0, "".~r3+32(SP)
0x0012 00018 (hello.go:54) MOVQ "".b+16(SP), AX
0x0017 00023 (hello.go:54) MOVQ AX, "".~r2+24(SP)
0x001c 00028 (hello.go:54) MOVQ "".a+8(SP), AX
0x0021 00033 (hello.go:54) MOVQ AX, "".~r3+32(SP)
0x0026 00038 (hello.go:54) RET
0x0000 48 c7 44 24 18 00 00 00 00 48 c7 44 24 20 00 00 H.D$.....H.D$ ..
0x0010 00 00 48 8b 44 24 10 48 89 44 24 18 48 8b 44 24 ..H.D$.H.D$.H.D$
0x0020 08 48 89 44 24 20 c3 .H.D$ .