Go | 函數(shù)注意事項(xiàng)

細(xì)節(jié)匯總

  1. 函數(shù)的形參列表可以是多個(gè),返回值列表也可以是多個(gè)
  2. 形參列表和返回值列表的數(shù)據(jù)類型,可以是值類型、也可以是引用類型
  3. 函數(shù)的命名遵循標(biāo)識(shí)符命名規(guī)范,首字母不能是數(shù)字,首字母大寫表示該函數(shù)可以被本包文件和其它文件使用,類似public;首字母小寫只能被本包文件使用,類似private。
  4. 函數(shù)中的變量是局部的,外部不能訪問(wèn)。作用域
  5. 基本數(shù)據(jù)類型和數(shù)組都是值傳遞的,即進(jìn)行值拷貝。在函數(shù)內(nèi)修改,不會(huì)影響到原來(lái)的值,
  6. 如果希望函數(shù)內(nèi)的變量能夠修改函數(shù)外的變量,可以傳入變量的地址(&),函數(shù)內(nèi)以指針的方式操作變量,從效果上看類似引用
  7. Go函數(shù)不支持函數(shù)重載。
  8. 在Go中,函數(shù)也是一種數(shù)據(jù)類型,可以賦值給一個(gè)變量,則該變量是一個(gè)函數(shù)類型的變量,通過(guò)該變量可以對(duì)函數(shù)調(diào)用。
  9. 函數(shù)既然是一種數(shù)據(jù)類型,因此在Go中,函數(shù)也可以作為形參,并且調(diào)用。(回調(diào)函數(shù)
  10. 為了簡(jiǎn)化數(shù)據(jù)類型定義,Go支持自定義數(shù)據(jù)類型
  • 語(yǔ)法: type 自定數(shù)據(jù)類型名 數(shù)據(jù)類型 (相當(dāng)于一個(gè)別名)

  • 案例: type myInt int 這時(shí),myInt就等價(jià)于int來(lái)使用了

  • type mySum func(int, int) int 這時(shí),mySum就等價(jià)于func(int, int) int

  1. 支持對(duì)函數(shù)返回值命名(可以不受返回值順序限制
  2. 使用 _ 下劃線標(biāo)識(shí)符,忽略返回值。(占位符
  3. Go支持可變參數(shù)

值傳遞和指針傳遞

func test(n1 int) {
    n1 = n1 + 10
    fmt.Println("test n1=", n1)
}

// 指針類型接收處理
func test02(n2 *int) {
    *n2 = *n2 + 10
    fmt.Println("test02 n2=", *n2)
}

func main() {
    n1 := 20
    n2 := 2
    test(n1) // 值類型
    test02(&n2) // 指針類型
    fmt.Println("main n1=", n1)
    fmt.Println("main n2=", n2)
}

什么是重載

重載: 函數(shù)名相同,但是形參不同或者數(shù)據(jù)類型不同的情況。

Golang語(yǔ)言中是不支持傳統(tǒng)的函數(shù)重載的,fn redeclared in this block

Golang語(yǔ)言是支持可變參數(shù)的,空接口的形式

函數(shù)類型的變量

類型: func(int, int) int

func getSum(n1 int, n2 int) int {
    return n1 + n2
}
func getSums(n1 int, n2 int, n3 int) int {
    return n1 + n2 + n3
}

// main 函數(shù)
sumFn := getSum
res := sumFn(10, 20)
fmt.Printf("%T %v\n", res, res) // int 30
fmt.Printf("%T \n", sumFn) // func(int, int) int

sumsFn := getSums
result := sumsFn(10, 20, 30)
fmt.Printf("result : %T %v\n", result, result) // result : int 60
fmt.Printf("sumsFn類型:%T \n", sumFn) // sumsFn類型:func(int, int) int

函數(shù)作為形參傳入

func getSum(n1 int, n2 int) int {
    return n1 + n2
}
func testFn(fnVar func(int, int) int, num1 int, num2 int) int {
    return fnVar(num1, num2) // 調(diào)用傳入的函數(shù),并返回值
}

// 函數(shù)類型形參
sumFn := getSum
total := testFn(sumFn, 1, 2)
fmt.Println("total=", total) // 3

自定義數(shù)據(jù)類型

  1. 自定義函數(shù)數(shù)據(jù)類型, 相當(dāng)于起了一個(gè)別名
type mySum func(int, int) int

func testFn(fnVar mySum, num1 int, num2 int) int {
    return fnVar(num1, num2)
}

// func testFn(fnVar func(int, int) int, num1 int, num2 int) int {
//  return fnVar(num1, num2)
// }
  1. 自定義數(shù)據(jù)類型
// main函數(shù)下
type myInt int
var num1 myInt = 2
// var num2 int = num1 // 這樣是報(bào)錯(cuò)的, myInt和int并不等價(jià)
var num2 int = int(num1) // 顯式類型轉(zhuǎn)換
fmt.Printf("num1的類型:%T 值:%v \n", num1, num1) // num1的類型:main.myInt 值:2
fmt.Printf("num2的類型:%T 值:%v \n", num2, num2) // num2的類型:int 值:2
  1. 定義的類型: 包名.類型名,如:utils.myInt
// 以下是utils包
package utils

import "fmt"

func TestFn() string {
    fmt.Println("TestFn 函數(shù)被調(diào)用")
    type myInt int
    var n myInt = 10
    fmt.Printf("n的類型:%T 值:%v", n, n) // n的類型:utils.myInt 值:10
    return "hahaha"
}

返回值命名

func sumSub(n1 int, n2 int) (sum int, sub int) {
    // 這里不需要聲明sum, sub變量了,也不用在return時(shí)寫
    sum = n1 + n2
    sub = n1 - n2
    return
}

// main函數(shù)
sum, sub := sumSub(9, 8)
fmt.Println("sum=", sum, "sub=", sub) // sum= 17 sub= 1

可變參數(shù)

基本語(yǔ)法

  1. 支持零到多個(gè)參數(shù)

func sum(args... int) {}

  1. 支持1到多個(gè)參數(shù)

func sum(n1 int, args... int) {}

args:就是一個(gè)承接的變量名,可以自定義,如:func sum(n1 int, **vars**... int) {}

說(shuō)明:

  • args是slice切片,通過(guò)args[index]可以訪問(wèn)到各個(gè)值
  • args必須放到形參列表的最后面

參數(shù)個(gè)數(shù)可變

func sumV2(n1 int, args ...int) int {
    sum := n1
    fmt.Printf("args類型是:%T\n", args) // args類型是:[]int
    // 遍歷args切片
    for i := 0; i < len(args); i++ {
        sum += args[i]
    }
    return sum
}

// main函數(shù)
// 參數(shù)可變
total02 := sumV2(1, 2, 3, 4)
fmt.Println("total02=", total02) // total02= 10

總結(jié)練習(xí)

交換變量a, b的值

package main

import "fmt"

func swap(n1 *int, n2 *int) {
    *n1 = *n1 + *n2
    *n2 = *n1 - *n2 // *n1
    *n1 = *n1 - *n2 // *n2
}

func main() {
    a := 12
    b := 20
    swap(&a, &b)
    fmt.Println("a = ", a, "b = ", b)
}

我是 甜點(diǎn)cc?

微信公眾號(hào):【看見(jiàn)另一種可能】

熱愛(ài)前端開發(fā),也喜歡專研各種跟本職工作關(guān)系不大的技術(shù),技術(shù)、產(chǎn)品興趣廣泛且濃厚。本號(hào)主要致力于分享個(gè)人經(jīng)驗(yàn)總結(jié),希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營(yíng)造一個(gè)良好的學(xué)習(xí)氛圍,為了個(gè)人和家庭、為了我國(guó)的互聯(lián)網(wǎng)物聯(lián)網(wǎng)技術(shù)、數(shù)字化轉(zhuǎn)型、數(shù)字經(jīng)濟(jì)發(fā)展做一點(diǎn)點(diǎn)貢獻(xiàn)。數(shù)風(fēng)流人物還看中國(guó)、看今朝、看你我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容