中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go中函數的使用方法與注意事項是什么

發布時間:2022-11-28 09:42:52 來源:億速云 閱讀:143 作者:iii 欄目:開發技術

今天小編給大家分享一下Go中函數的使用方法與注意事項是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

細節匯總

  • 函數的形參列表可以是多個,返回值列表也可以是多個

  • 形參列表和返回值列表的數據類型,可以是值類型、也可以是引用類型

  • 函數的命名遵循標識符命名規范,首字母不能是數字,首字母大寫表示該函數可以被本包文件和其它文件使用,類似public;首字母小寫只能被本包文件使用,類似private。

  • 函數中的變量是局部的,外部不能訪問。作用域

  • 基本數據類型和數組都是值傳遞的,即進行值拷貝。在函數內修改,不會影響到原來的值,

  • 如果希望函數內的變量能夠修改函數外的變量,可以傳入變量的地址(&),函數內以指針的方式操作變量,從效果上看類似引用

  • Go函數不支持函數重載。

  • 在Go中,函數也是一種數據類型,可以賦值給一個變量,則該變量是一個函數類型的變量,通過該變量可以對函數調用。

  • 函數既然是一種數據類型,因此在Go中,函數也可以作為形參,并且調用。(回調函數

  • 為了簡化數據類型定義,Go支持自定義數據類型

  • 語法: type 自定數據類型名 數據類型 (相當于一個別名)

  • 案例: type myInt int 這時,myInt就等價于int來使用了

  • type mySum func(int, int) int 這時,mySum就等價于func(int, int) int

  • 支持對函數返回值命名(可以不受返回值順序限制

  • 使用 _ 下劃線標識符,忽略返回值。(占位符

  • Go支持可變參數

值傳遞和指針傳遞

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)
}

什么是重載

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

Golang語言中是不支持傳統的函數重載的,fn redeclared in this block

Golang語言是支持可變參數的,空接口的形式

Go中函數的使用方法與注意事項是什么

函數類型的變量

類型: 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 函數
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

函數作為形參傳入

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) // 調用傳入的函數,并返回值
}

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

自定義數據類型

  • 自定義函數數據類型, 相當于起了一個別名

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)
// }
  • 自定義數據類型

// main函數下
type myInt int
var num1 myInt = 2
// var num2 int = num1 // 這樣是報錯的, myInt和int并不等價
var num2 int = int(num1) // 顯式類型轉換
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 函數被調用")
	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時寫
	sum = n1 + n2
	sub = n1 - n2
	return
}

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

可變參數

基本語法

  • 支持零到多個參數

func sum(args... int) {}

  • 支持1到多個參數

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

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

說明:

  • args是slice切片,通過args[index]可以訪問到各個值

  • args必須放到形參列表的最后面

參數個數可變

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函數
// 參數可變
total02 := sumV2(1, 2, 3, 4)
fmt.Println("total02=", total02) // total02= 10

總結練習

交換變量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)
}

以上就是“Go中函數的使用方法與注意事項是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

元阳县| 兴安盟| 正安县| 绥阳县| 岳西县| 太原市| 巫山县| 高淳县| 神农架林区| 宣化县| 云霄县| 瑞丽市| 沂水县| 大厂| 大名县| 合阳县| 通河县| 遵义县| 天津市| 鱼台县| 长治市| 保定市| 塘沽区| 宣武区| 东城区| 唐海县| 高碑店市| 科技| 拉萨市| 南郑县| 海阳市| 定襄县| 夹江县| 通辽市| 蒙自县| 泗阳县| 葵青区| 诸暨市| 教育| 武平县| 天全县|