函數
作爲增強代碼的複用性性和可讀性,函數必不可少。
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示例,請參閱一些面試題。
再次強調:這個系列並不是教程,如果想系統的學習,博主可推薦學習資源。