【Golang】快速複習指南QuickReview(四)——函數

函數

作爲增強代碼的複用性性和可讀性,函數必不可少。

1.C#中的函數

1.1 可變參數params

static int IntSum(int x, int y)
{
    return x + y;
}

//重載,可變參數
static int IntSum(params int[] x)
{
    int sum = 0;
    for (int i = 0; i < x.Length; i++)
    {
        sum += x[i];
    }
    return sum;
}

1.2 返回多個值

參數out

static void Calc(int x, int y, out int sum, out int sub)
{
    sum = x + y;
    sub = x - y;
}

Tuple-元組

//元組
// static (int, int) Calc(int x, int y)
static (int sum, int sub) Calc(int x, int y)
{
    return (x + y, x - y);
}

1.3 delegate委託(函數類型)

C#中函數類型就是委託

public delegate (int, int) CalculationHandler(int x, int y);

//使用
static void TestDelegate(CalculationHandler handler)
{

}

//調用傳值
TestDelegate((x, y) =>
             {
                 return (x + y, x - y);
             });
//匿名函數
TestDelegate(delegate (int x, int y)
             {
                 return (x + y, x - y);
             });

2.Golang中的函數

Golang的返回值在函數名及參數之後,函數必須寫註釋,且以函數名開頭,否則golint會有綠色的提示

2.1 可變參數...

// IntSum 寫註釋喲
func IntSum(x int, y int) int {
    return x + y
}

//go是不支持函數重載的
func Sum(x ...int) int {
	//此時x是一個切片
	sum := 0
	for _, v := range x {
		sum = sum + v
	}
	return sum
}

2.2 返回多個值

多看幾個形式,不爲別的,只爲能看懂別人的源碼

func Calc(x int, y int) (sum int,sub int) {
	sum = x + y
	sub = x - y
	return sum, sub
}
func Calc(x int, y int) ( int, int) {
    sum := x + y
    sub := x - y
	return sum, sub
}
func Calc(x, y int) (int, int) {
	sum := x + y
	sub := x - y
	return sum, sub
}

2.3 函數類型

函數做爲一種類型,Golang的定義更直接:

type calculation func(int, int) (int, int)

2.3.1 使用

func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
	fmt.Printf("result:sum-%v sub-%v \n", sum, sub)
    sum1, sub2 := testFuncType(8, 6, addOrSub)
    fmt.Printf("result:sum-%v sub-%v \n", sum1, sub2)
}
type calculation func(int, int) (int, int)
func addOrSub(x, y int) (int, int) {
	return x + y, x - y
}

// testFuncType 這個就比較像委託了
func testFuncType(x, y int, op calculation) (int, int) {
	return op(x, y)
}

2.3.2 匿名函數

Golang的匿名函數沒有任何關鍵字,也是簡單粗暴的使用:

addOrSubTest := func(x, y int) (int, int) {
    return x + y, x - y
}
sum3, sub3 := addOrSubTest(9, 6)
fmt.Printf("anonymous function:sum-%v sub-%v \n", sum3, sub3)

2.4 返回值爲函數

既然函數是一種類型,那麼也可作爲函數的返回值

func do(s string) func(int, int) int {
	switch s {
	case "+":
		return func(x int, y int) int {
			return x + y
		}
	case "-":
		return func(x int, y int) int {
			return x - y
		}
	default:
		return nil
	}
}

2.5 新內容 defer

defer語句會將其後面跟隨的語句進行延遲處理。函數即將return,將延遲處理的語句按defer定義的逆序進行執行,也就是說,先定義defer的語句最後被執行,最後定義的defer的語句,最先執行。像棧一樣,先進後出,後進先出。

func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
	fmt.Printf("result:sum-%v sub-%v \n", sum, sub)
}
type calculation func(int, int) (int, int)
func addOrSub(x, y int) (int, int) {
	defer fmt.Println("addOrSub1")
	defer fmt.Println("addOrSub2")
	defer fmt.Println("addOrSub3")
	fmt.Printf("result:%v and %v\n", x+y, x-y)
	return x + y, x - y
}
result:11 and -1
addOrSub3
addOrSub2
addOrSub1
result:sum-11 sub--1

更復雜(坑爹)的defer示例,請參閱一些面試題。

再次強調:這個系列並不是教程,如果想系統的學習,博主可推薦學習資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章