最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)詳解

 更新時(shí)間:2022年11月26日 16:09:07   作者:甜點(diǎn)cc  
在Go語言中函數(shù)可是一等的(first-class)公民,函數(shù)類型也是一等的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

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

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

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

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

  • 支持對函數(shù)返回值命名(可以不受返回值順序限制
  • 使用 _ 下劃線標(biāo)識(shí)符,忽略返回值。(占位符
  • 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語言中是不支持傳統(tǒng)的函數(shù)重載的,fn redeclared in this block

Golang語言是支持可變參數(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ù)類型

  • 自定義函數(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)
// }
  • 自定義數(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
  • 定義的類型: 包名.類型名,如: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ù)

基本語法

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

func sum(args... int) {}

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

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

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

說明:

  • args是slice切片,通過args[index]可以訪問到各個(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)
}

到此這篇關(guān)于Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Go函數(shù)使用和注意內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go切片的copy和view的使用方法

    go切片的copy和view的使用方法

    這篇文章主要介紹了go切片的copy和view的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解Go語言中切片的長度與容量的區(qū)別

    詳解Go語言中切片的長度與容量的區(qū)別

    切片可以看成是數(shù)組的引用,切片的長度是它所包含的元素個(gè)數(shù)。切片的容量是從它的第一個(gè)元素到其底層數(shù)組元素末尾的個(gè)數(shù)。本文將通過示例詳細(xì)講講Go語言中切片的長度與容量的區(qū)別,需要的可以參考一下
    2022-11-11
  • 分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷

    分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷

    這篇文章主要為大家介紹了分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go之集合slice的實(shí)現(xiàn)

    Go之集合slice的實(shí)現(xiàn)

    本文主要介紹了Go之集合slice的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • GO語言包管理工具go?mod以及包詳解

    GO語言包管理工具go?mod以及包詳解

    go mod是go的一個(gè)模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于GO語言包管理工具go?mod以及包詳解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • golang1.21新特性全面講解

    golang1.21新特性全面講解

    經(jīng)過了半年左右的開發(fā),golang?1.21?最近正式發(fā)布了,這個(gè)版本中有不少重要的新特性和變更,尤其是在泛型相關(guān)的代碼上,下面小編就來和大家好好嘮嘮吧
    2023-08-08
  • Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解

    Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)實(shí)例

    Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)實(shí)例

    golang語言本身就是c的工具集,開發(fā)c的程序用到的大部分結(jié)構(gòu)體,內(nèi)存管理,攜程等,golang基本都有,下面這篇文章主要給大家介紹了關(guān)于Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 詳解Golang中g(shù)omock的使用場景和方法

    詳解Golang中g(shù)omock的使用場景和方法

    gomock是Go編程語言的模擬框架, 它與Go的內(nèi)置測試包很好地集成在一起,但也可以在其他上下文中使用,本文主要介紹了gomock的使用場景和方法,感興趣的可以了解下
    2024-10-10
  • Go語言中的函數(shù)詳解

    Go語言中的函數(shù)詳解

    函數(shù)是基本的代碼塊,用于執(zhí)行一個(gè)任務(wù)。本文詳細(xì)講解了Go語言中的函數(shù),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

尚志市| 勐海县| 平昌县| 梁平县| 两当县| 扬中市| 瓦房店市| 金山区| 金堂县| 南召县| 灵山县| 林芝县| 长沙县| 阿鲁科尔沁旗| 乌兰县| 嘉禾县| 黄陵县| 巫山县| 嘉峪关市| 察隅县| 新巴尔虎左旗| 叙永县| 吐鲁番市| 石台县| 南漳县| 石嘴山市| 七台河市| 红河县| 三原县| 平山县| 宁国市| 乐亭县| 专栏| 屏东县| 渝北区| 海原县| 大丰市| 林西县| 博湖县| 县级市| 成武县|