GoLang学习函数

Scroll Down

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$ .