本篇內容主要講解“Go語言函數和指針的概念”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Go語言函數和指針的概念”吧!
成都創新互聯公司是一家專業提供新平企業網站建設,專注與成都網站制作、成都網站設計、H5高端網站建設、小程序制作等業務。10年已為新平眾多企業、政府機構等服務。創新互聯專業網絡公司優惠進行中。
函數就是一段基本的代碼塊,一般用來對需要重復執行的代碼進行復用。在 go 中,函數是『一等公民』,這與 js 類似,也就是可以將函數當做一個變量進行傳遞。
由于是強類型語言,與 js 不同,在函數聲明的過程中,需要指定參數與返回值的類型。
func max (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result }
在聲明函數參數和類型的時候,與聲明變量類似,可以一次性指定多個參數的類型,也可以分別指定多個參數為不同類型。
func max (n1 int, n2 int) int { …… }
如果函數返回值有多個,在指定返回類型的時候,需要指定每個返回值的類型。
func max (n1 int, n2 int) (error, int) { …… return errors.New(""), result }
上面的代碼,表示返回的時候需要返回兩個值,第一個值為 error 對象,用來表示執行期間是否出現異常。這種方式也是 Node.js 中常見的 error-first callback 的寫法。
在 go 中,有兩個特殊函數:main、init,這兩個函數聲明之后,一般不需要主動調用,會有自動執行的機制。
func main()
main 函數是 go 語言中默認的入口函數,只能應用于 package main 中,如果在其他的 package 中不會執行。main 函數有如下幾點需要注意:
不能定義參數;
不能定義返回值;
必須在 package main 中聲明;
func init()
init 函數所有的包啟動的時候都會執行,執行時機比 main 函數早,與 main 函數一樣,不能定義參數和返回值。
package main import "fmt" func init() { fmt.Println("執行 init 函數\n") } func main() { fmt.Println("執行 main 函數\n") }
函數的調用比較簡單,和其他編程語言類似,只需要將函數需要接受的參數傳入其中,在執行結束后,就能得到對應的返回值。
// 定義 max 函數 func max (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result } func main () { var result = max(5, 100) fmt.Println("max return", result) }
匿名函數就是一個沒有定義函數名的函數,匿名函數可以當成一個值,將其賦值放到某個變量中。這也是之前為什么說函數是『一等公民』,就是可以將函數當成一個變量。
var max = func (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result } var result = max(5, 100) fmt.Println("max return", result)
由于 go 中的函數是 『一等公民』,可以在聲明之后立即執行,就是在函數聲明結束后,直接加上一個括號,表示該函數會立即執行,執行之后的結果可以通過變量進行接收。
import "math" var Pi = func () float64 { return math.Pi }() fmt.Println("PI =",Pi)
“閉包就是能夠讀取其他函數內部變量的函數。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。 ——百度百科
上面的描述來自百度百科,初次看概念比較難理解,如果站在使用的角度來說,閉包就是在一個函數調用后,返回另一個匿名函數,并保持當前函數內的局部變量,可以給匿名函數引用。
下面我們可以簡單實現一個迭代器函數,該函數接受一個切片,返回一個匿名函數,該匿名函數每次執行,都會取出切片的一個值,直到全部讀取。
func generate(slice []int) func() (bool, int) { i := 0 length := len(slice) return func () (bool, int) { if i >= length { return true, 0 } var result = slice[i] i++ return false, result } } func main() { slice := []int{1, 2, 3, 4, 5} nextNum := generate(slice) done, result := nextNum() // 直到 done 不等于 false,才停止 for done == false { fmt.Println(result, done) done, result = nextNum() } fmt.Println(result, done) }
我們前面常說的變量指的一般是一個值,指針是指向該變量存儲在內存的位置。指針也可以存儲在一個變量中,該變量稱為『指針變量』。
聲明指針變量時,需要指針指向哪一種類型,因為不同類型的值在內存占用的空間大小不一樣,僅僅知道內存地址還是不夠,還需要知道該變量在內存中占用多大空間。聲明指針變量只需要在類型前,加上 * 即可。
var point *int // 聲明 int 類型的指針
給指針變量賦值,需要在對應類型的變量前加上&符號,表示取出該變量的地址。
var i = 1 var point *int point = &i
一般情況下,我們傳入函數的參數僅為變量的值,這樣的傳遞被稱為值傳遞,在函數內對參數修改也不會影響到外部變量。
func addOne(slice []int, number int) { slice = append(slice, number) fmt.Println("inner slice =", slice) } slice := []int{1, 2, 3} addOne(slice, 100) fmt.Println("outer slice =", slice)
上述代碼中,我們寫了一個函數,會對傳入的切片追加一個值,調用之后,我們會發現外部切片的值并沒有發生變量。
如果需要外部變量的值會跟隨函數調用發生變化,就需要將變量的指針傳入函數中,這樣的傳遞被稱為引用傳遞。這樣在函數中修改參數就會影響到外部的變量了。
// 此時 slice 為指針變量 func addOne(slice *[]int, number int) { // 通過 *slice 可以取出 slice 指針對應的值 *slice = append(*slice, number) fmt.Println("inner slice =", *slice) } slice := []int{1, 2, 3} addOne(&slice, 100) fmt.Println("outer slice =", slice)
到此,相信大家對“Go語言函數和指針的概念”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
分享標題:Go語言函數和指針的概念
本文網址:http://m.newbst.com/article0/gpjeio.html
成都網站建設公司_創新互聯,為您提供做網站、企業建站、關鍵詞優化、建站公司、網站排名、動態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯