一文了解Go語言中的函數(shù)與方法的用法
函數(shù)定義語法
與大部分語言一致,Go語言中的函數(shù)定義與其他語言基本一致
func function_name(Parameter-list) { // function body... } func function_name(Parameter-list) Return-Type { // function body... } func function_name(Parameter-list) (Multiple Return-Types){ // function body.. }
func: 函數(shù)定義關(guān)鍵字
function_name: 函數(shù)名稱,Go語言主要使用camel-case(駝峰)命名的方式,還根據(jù)函數(shù)的性質(zhì),用首字母大小寫區(qū)分作用,具體會在后面專門的章節(jié)講解Go語言的規(guī)范
Parameter-list: 參數(shù)列表,如果沒有可以忽略
Return-Type/Multiple Return-Types: 返回值的類型,即return返回值的類型,這里特別將三種形式進(jìn)行了區(qū)分:
- 無返回值/單一返回值/多返回值
- 另外兩種的細(xì)小的區(qū)別在于括號的使用,單一返回類型一般不再添加括號,而多返回值則需要添加括號
- 另外為了美觀,參數(shù)列表后面的括號,建議與返回類型之間有一個(gè)空格
函數(shù)定義示例
無返回值函數(shù)
func HelloFunc() { fmt.Println("Hello, World") }
單一返回值函數(shù)
本示例中演示了參數(shù)定義方法和返回值類型定義方法
func HelloFunc(msg string) string { return "Hello, " + msg }
多返回值函數(shù)
第二個(gè)返回值的類型通常用于回傳錯(cuò)誤,這樣方便程序進(jìn)行異常處理
func HelloFunc(msg string) (string, error) { return "Hello, " + msg, nil }
我們再來看一下完整的代碼實(shí)現(xiàn),主函數(shù)中調(diào)用HelloFunc時(shí),也需要兩個(gè)變量接收相應(yīng)的值
package main import "fmt" func HelloFunc(msg string) (string, error) { return "Hello, " + msg, nil } func main() { printString, err := HelloFunc("World") if err == nil { fmt.Println(printString) } }
方法(Method)定義
Go語言中并沒有類,所以在Go語言中提供了一種類似函數(shù)定義的方法定義,通過在函數(shù)名稱前增加Reciever類型,實(shí)現(xiàn)一種類似類中方法的定義,方法可以使用Reciver的屬性。我們來看一下語法:
func (Reciever-Name Type) function_name(Parameter-list) (Multiple Return-Types){ // function body.. }
由于大部分定義內(nèi)容與上述函數(shù)定義相同,這里就不再贅述,只介紹一下新增的部分:
Reciever-Name:類型必須是自定義類型,不能是內(nèi)置的int, string等,使用的話,在編譯階段就會報(bào)錯(cuò)
方法(Method)示例
基本類型
我們來看一個(gè)通過基本類型實(shí)現(xiàn)的方法,這里使用到了一個(gè)未曾學(xué)習(xí)到的知識點(diǎn)——自定義類型type,后面還會詳細(xì)講解,不用在此處糾結(jié)。這句含義就是通過自定義類型mystring再次定義的變量,本質(zhì)上與string同一類型。
type mystring string
這里注意我們的函數(shù)定義,在函數(shù)名前,多了(msg mystring)的定義,而在函數(shù)體內(nèi),我們也可以直接使用msg
func (msg mystring) HelloFunc() { str := "Hello, " + msg fmt.Println(str) }
而在main函數(shù)中進(jìn)行調(diào)用時(shí),與上面的函數(shù)調(diào)用不同,我們直接使用調(diào)用mymsg的方法HelloFunc,實(shí)現(xiàn)了與上面例子類似的方法
var mymsg mystring mymsg = "World" mymsg.HelloFunc()
完整代碼如下所示
package main import "fmt" type mystring string func (msg mystring) HelloFunc() { str := "Hello, " + msg fmt.Println(str) } func main() { var mymsg mystring mymsg = "World" mymsg.HelloFunc() }
結(jié)構(gòu)體類型
其實(shí)從各個(gè)項(xiàng)目的源代碼來看,方法還是更多的與結(jié)構(gòu)體(struct)和接口(interface)一起使用,這些都會在后面進(jìn)行詳細(xì)講解,這里只需要了解即可。這里介紹一個(gè)簡單的例子,我們來計(jì)算長方形的面積。
- 定義了一個(gè)結(jié)構(gòu)體rect,其中包含長和寬兩個(gè)屬性
- 計(jì)算面積的方法area(),Reciver定義為結(jié)構(gòu)體類型,這樣方法體內(nèi),就可以使用長和寬計(jì)算面積
- 主函數(shù)中,定義了一個(gè)結(jié)構(gòu)體,并且初始化長和寬分別為3和4
- 調(diào)用自定義結(jié)構(gòu)體的r.area()完成面積計(jì)算
package main import "fmt" type rect struct { width float64 height float64 } func (r rect) area() float64 { return r.width * r.height } func main() { r := rect{3, 4} rectArea := r.area() fmt.Printf("Rect area is %v\n", rectArea) }
到此這篇關(guān)于一文了解Go語言中的函數(shù)與方法的用法的文章就介紹到這了,更多相關(guān)Go語言 函數(shù) 方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn)
本文主要介紹了golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12深入了解Go語言中web框架的中間件運(yùn)行機(jī)制
大家在使用iris框架搭建web系統(tǒng)時(shí),一定會用到中間件。那么你了解中間件的運(yùn)行機(jī)制嗎?你知道為什么在iris和gin框架的請求處理函數(shù)中要加c.Next()函數(shù)嗎?本文就和大家一起探究該問題的答案2023-02-02go?mode?tidy出現(xiàn)報(bào)錯(cuò)go:?warning:?“all“?matched?no?package
使用go的時(shí)候我們一般都會使用go?mode管理,下面這篇文章主要給大家介紹了關(guān)于go?mode?tidy出現(xiàn)報(bào)錯(cuò)go:?warning:?“all“?matched?no?packages的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08golang Goroutine超時(shí)控制的實(shí)現(xiàn)
日常開發(fā)中我們大概率會遇到超時(shí)控制的場景,比如一個(gè)批量耗時(shí)任務(wù)、網(wǎng)絡(luò)請求等,本文主要介紹了golang Goroutine超時(shí)控制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09