Go 語(yǔ)言基礎(chǔ)-函數(shù)
回復(fù)“Go語(yǔ)言”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
你好,我是四哥。
上篇文章我們講了常量,今天來學(xué)習(xí)下函數(shù)。
什么是函數(shù)?
函數(shù)是執(zhí)行特定任務(wù)的代碼塊。函數(shù)接受輸入,對(duì)輸入執(zhí)行一些計(jì)算,然后生成輸出。
函數(shù)聲明
Go 語(yǔ)言函數(shù)聲明語(yǔ)法如下:
func?functionname(parametername?type)?returntype?{
?//function?body
}
函數(shù)聲明以 func 關(guān)鍵字開頭,后跟函數(shù)名。中括號(hào) () 里面指定參數(shù),后跟函數(shù)的返回類型。指定參數(shù)的語(yǔ)法是參數(shù)名稱后面跟參數(shù)類型,可以指定任意數(shù)量的參數(shù),像下面這樣:
(parameter1?type,?parameter2?type)
函數(shù)的主體部分放在大括號(hào)里面。
參數(shù)和返回值都是可選的,因此下面這種聲明方式也是有效的函數(shù)聲明:
func?functionname()?{
}
簡(jiǎn)單函數(shù)
我們來寫一個(gè)函數(shù),函數(shù)的參數(shù)是商品單價(jià)和商品數(shù)量,實(shí)現(xiàn)計(jì)算商品總價(jià)并返回。
func?calculateBill(price?int,?no?int)?int?{
????var?totalPrice?=?price?*?no
????return?totalPrice
}
上面函數(shù)的輸入?yún)?shù)是 price 和 no,都是 int 型,兩者的乘積賦值給 totalPrice 并作為返回值返回,totalPrice 也是 int 型。
如果連續(xù)的參數(shù)都是相同的類型,我們可以避免每個(gè)參數(shù)都指定類型,只需要指定最后一個(gè)參數(shù)的類型即可,比如 price int, no int 就可以寫成 price, no int,所以上面的函數(shù)可以修改成:
func?calculateBill(price,?no?int)?int?{
????var?totalPrice?=?price?*?no
????return?totalPrice
}
現(xiàn)在我們已經(jīng)寫好了一個(gè)函數(shù),我們嘗試來調(diào)用這個(gè)函數(shù)。調(diào)用函數(shù)的語(yǔ)法是 functionname(parameters),上面的函數(shù)就可以像下面這樣調(diào)用:
calculateBill(10,?5)
下面是完成的程序:
package?main
import?(
????"fmt"
)
func?calculateBill(price,?no?int)?int?{
????var?totalPrice?=?price?*?no
????return?totalPrice
}
func?main()?{
????price,?no?:=?90,?6
????totalPrice?:=?calculateBill(price,?no)
????fmt.Println("Total?price?is",?totalPrice)
}
執(zhí)行[1]
上面的代碼輸出:
Total?price?is?540
多值返回
Go 語(yǔ)言是允許函數(shù)返回多個(gè)值的。我們來寫一個(gè) rectProps() 函數(shù),該函數(shù)的參數(shù)是長(zhǎng)方形的 length 和 width,返回長(zhǎng)方形的 area(面積) 和 perimeter(周長(zhǎng))。
package?main
import?(
????"fmt"
)
func?rectProps(length,?width?float64)(float64,?float64)?{
????var?area?=?length?*?width
????var?perimeter?=?(length?+?width)?*?2
????return?area,?perimeter
}
func?main()?{
?????area,?perimeter?:=?rectProps(10.8,?5.6)
????fmt.Printf("Area?%f?Perimeter?%f",?area,?perimeter)
}
執(zhí)行[2]
如果一個(gè)函數(shù)返回多個(gè)值則需要使用 () 指定,比如:
func?rectProps(length,?width?float64)(float64,?float64)
該函數(shù)有兩個(gè) float64 參數(shù) length 和 width,也返回兩個(gè) float64 類型的值。
上面的代碼輸出:
Area?60.480000?Perimeter?32.800000
命名返回值
可以從函數(shù)返回命名值。如果返回值被命名,則可以認(rèn)為它在函數(shù)的第一行被聲明為變量,并初始化為相應(yīng)類型的零值。
上面的 rectProps() 函數(shù)可以使用命名的返回值重寫:
func?rectProps(length,?width?float64)(area,?perimeter?float64)?{
????area?=?length?*?width
????perimeter?=?(length?+?width)?*?2
????return?//no?explicit?return?value
}
area 和 perimeter 是函數(shù)中命名的返回值。
需要注意的是,函數(shù)里的 return 語(yǔ)句沒有返回任何值。由于在函數(shù)聲明中將 area 和 perimeter 指定為返回值,因此當(dāng)遇到 return 語(yǔ)句時(shí),它們會(huì)自動(dòng)從函數(shù)中返回。
空白符
Go 語(yǔ)言里面,下劃線 _ 可以被當(dāng)做空白符使用。它可以用來代替任何類型的任何值,讓我們看看這個(gè)空白標(biāo)識(shí)符有什么用。
rectProps() 函數(shù)返回長(zhǎng)方形的面積和周長(zhǎng)。如果我們只想要面積,而不想要周長(zhǎng)那該怎么辦呢?這時(shí)候空百符 _ 就可以派上用場(chǎng)了。
package?main
import?(
????"fmt"
)
func?rectProps(length,?width?float64)?(float64,?float64)?{
????var?area?=?length?*?width
????var?perimeter?=?(length?+?width)?*?2
????return?area,?perimeter
}
func?main()?{
????area,?_?:=?rectProps(10.8,?5.6)?//?perimeter?is?discarded
????fmt.Printf("Area?%f?",?area)
}
執(zhí)行[3]
上面代碼的第 13 行,我們接收了函數(shù)返回的 area,并使用 _ 忽略了 perimeter。
https://golangbot.com/functions/
作者:Naveen R
參考資料
執(zhí)行: https://play.golang.org/p/FtjhPcx3ySa
[2]執(zhí)行: https://play.golang.org/p/qAftE_yke_
[3]執(zhí)行: https://play.golang.org/p/IkugSH1jIt
資料下載
點(diǎn)擊下方卡片關(guān)注公眾號(hào),發(fā)送特定關(guān)鍵字獲取對(duì)應(yīng)精品資料!
回復(fù)「電子書」,獲取入門、進(jìn)階 Go 語(yǔ)言必看書籍。
回復(fù)「視頻」,獲取價(jià)值 5000 大洋的視頻資料,內(nèi)含實(shí)戰(zhàn)項(xiàng)目(不外傳)!
回復(fù)「路線」,獲取最新版 Go 知識(shí)圖譜及學(xué)習(xí)、成長(zhǎng)路線圖。
回復(fù)「面試題」,獲取四哥精編的 Go 語(yǔ)言面試題,含解析。
回復(fù)「后臺(tái)」,獲取后臺(tái)開發(fā)必看 10 本書籍。
對(duì)了,看完文章,記得點(diǎn)擊下方的卡片。關(guān)注我哦~???????

歡迎大家點(diǎn)贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
