banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

【轉載】golang函數的參數

title: 【轉載】golang 函數的參數
date: 2022-06-17 16:58:00
toc: false
index_img: http://api.btstu.cn/sjbz/?lx=m_dongman&cid=4
category:

  • Go
    tags:
  • Golang

原文:golang 函數的參數 - Golang 技術棧,Golang 文章、教程、視頻分享!,本站僅作保存記錄及調整排版,不做盈利性質的商業行為。

提示:本文有提到指針傳遞的類型!

go 語言函數可以有 0 或多個參數,參數需要指定 數據類型

聲明函數時的參數列表叫做形參,調用時傳遞的參數叫做實參。

go 語言是通過傳值的方式傳參的,意味著傳遞給函數的是拷貝後的副本,所以函數內部訪問、修改的也是這個副本。

go 語言可以使用 變長參數 ,有時候並不能確定參數的個數,可以使用變長參數,可以在函數定義語句的參數部分使用 ARGS...TYPE的方式。這時會將 ...代表的參數全部保存到一個名為 ARGS 的 slice 中,注意這些參數的數據類型都是 TYPE。

go 語言函數的參數實例#

go 語言傳參

// 形參列表
func f1(a int, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

func main() {
	// 實參列表
	r := f1(1, 2)
	fmt.Printf("r: %v\n", r)
}

演示參數傳遞,按值傳遞

func f1(a int) {
	a = 200
	fmt.Printf("a1: %v\n", a)
}

func main() {
	a := 100
	f1(a)
	fmt.Printf("a: %v\n", a)
}

運行結果

a1: 200
a: 100

從運行結果可以看到,調用函數 f1 後,a 的值並沒有被改變,說明參數傳遞是拷貝了一個副本,也就是拷貝了一份新的內容進行運算。

mapsliceinterfacechannel這些數據類型本身就是指針類型的,所以就算是拷貝傳值也是拷貝的指針,拷貝後的參數仍然指向底層數據結構,所以修改它們可能會影響外部數據結構的值。

package main

import "fmt"

func f1(a []int) {
	a[0] = 100
}

func main() {
	a := []int{1, 2}
	f1(a)
	fmt.Printf("a: %v\n", a)
}

運行結果

a: [1 2]
a: [100 2]

從運行結果發現,調用函數後,slice 內容被改變了。

變長參數

package main

import "fmt"

func f1(args ...int) {
	for _, v := range args {
		fmt.Printf("v: %v\n", v)
	}
}
func f2(name string, age int, args ...int) {
	fmt.Printf("name: %v\n", name)
	fmt.Printf("age: %v\n", age)
	for _, v := range args {
		fmt.Printf("v: %v\n", v)
	}
}
func main() {
	f1(1, 2, 3)
	fmt.Println("------------")
	f1(1, 2, 3, 4, 5, 6)
	fmt.Println("------------")
	f2("tom", 20, 1, 2, 3)
}

運行結果

v: 1
v: 2
v: 3
------------
v: 1
v: 2
v: 3
v: 4
v: 5
v: 6
------------
name: tom
age: 20
v: 1
v: 2
v: 3
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。