1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      go語言為什么存在指針 go中的指針

      淺談Go語言函數(shù)與方法的區(qū)別

      前段時間,我們實驗室用go作為后臺開發(fā)語言開發(fā)了一個web項目,由于這是自己第一次使用go語言進(jìn)行開發(fā),在開發(fā)過程中,一味著追求完成任務(wù),在編碼的時候沒有太注重性能,雖然勉強(qiáng)實現(xiàn)了功能,但是對go語言的理解還是比較淺顯的。下面來談?wù)勛约簩o語言中函數(shù)與方法的理解。

      創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供漢南網(wǎng)站建設(shè)、漢南做網(wǎng)站、漢南網(wǎng)站設(shè)計、漢南網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、漢南企業(yè)網(wǎng)站模板建站服務(wù),十余年漢南做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

      普通函數(shù):

      go函數(shù)可以返回多個值

      值傳遞: 值傳遞是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣函數(shù)中如果對參數(shù)進(jìn)行修改,將不會影響到實際參數(shù)

      引用傳遞: 引用傳遞是指在調(diào)用函數(shù)將實際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)進(jìn)行的修改,將影響到實際參數(shù)。

      一般來說go語言函數(shù)的 接收者(也就是形參)一般放在函數(shù)名后面 ,不能將指針類型的數(shù)據(jù)直接傳遞,也就是說函數(shù)形參如果是值類型,調(diào)用者必須使用值作為實參過來,如果函數(shù)形參是指針類型,則函數(shù)調(diào)用者需使用指針作為實參來調(diào)用。

      普通方法:

      接收者是在func關(guān)鍵字后面,而不是在函數(shù)名稱后面,接收者可以是自己定義的一個類型,這個類型可以是struct、interface,一個方法就是一個包含了接收者的函數(shù),接收者可以是命名類型或者是結(jié)構(gòu)體類型的一個值或者是一個指針。

      下面是一個例子來說明方法和函數(shù)的區(qū)別(重點(diǎn))

      golang函數(shù)返回slice和返回 slice的指針有什么區(qū)別

      按照你的定義,slice是切片,而p是指針。切片是一個結(jié)構(gòu)體頭部+數(shù)組區(qū)域,其頭部結(jié)構(gòu)定義如下:

      struct Slice

      { // must not move anything

      byte* array; // actual data

      uintgo len; // number of elements

      uintgo cap; // allocated number of elements

      };

      因此,slice的返回其實是頭部值返回,函數(shù)內(nèi)外的地址是不同的,這也導(dǎo)致主程序中,ss與pp不同。因為ss是新分配的,pp則是與子程序testInterface中的slice相同。簡單修改你的代碼,通過輸出對比,會非常清晰:

      package main

      import (

      "fmt"

      )

      func testInterface() (slice interface{}, p interface{}) {

      slice = make([]int, 10)

      p = slice

      fmt.Println("debug:testInterface")

      fmt.Println(slice)//兩個地址應(yīng)該相同

      fmt.Println(p) //兩個地址應(yīng)該相同

      return slice, p

      }

      func main() {

      fmt.Println("debug:main")

      ss, pp := testInterface()

      fmt.Println(ss)

      fmt.Println(pp) //應(yīng)該與子程序的輸出一致

      }

      另外,第一個問題就不用多解釋,依然是值和指針不同了。

      GO語言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

      GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進(jìn)行排列

      GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

      GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等

      GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行

      一個簡單的示例:

      輸出為:

      參數(shù):可以傳0個或多個值來供自己用

      返回:通過用 return 來進(jìn)行返回

      輸出為:

      上面就是一個典型的多參數(shù)傳遞與多返回值

      對例子的說明:

      按值傳遞:是對某個變量進(jìn)行復(fù)制,不能更改原變量的值

      引用傳遞:相當(dāng)于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗

      在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

      當(dāng)返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補(bǔ)位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉

      在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)

      輸出為:

      在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似

      在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;

      如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;

      當(dāng)某個函數(shù)出現(xiàn)嚴(yán)重錯誤時, defer 也會被調(diào)用

      輸出為

      這是一個最簡單的測試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進(jìn)行判斷,非常快速,這種留給你們?nèi)崿F(xiàn)

      一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

      本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct


      當(dāng)前題目:go語言為什么存在指針 go中的指針
      網(wǎng)頁鏈接:http://ef60e0e.cn/article/dogsdos.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        左贡县| 怀集县| 阿勒泰市| 尼玛县| 洛隆县| 福泉市| 日喀则市| 岑巩县| 方城县| 青铜峡市| 汶川县| 罗平县| 固安县| 理塘县| 奉新县| 太仆寺旗| 黔西| 青田县| 云梦县| 津市市| 谢通门县| 吉水县| 武宣县| 江陵县| 望谟县| 高安市| 聂拉木县| 额济纳旗| 齐齐哈尔市| 尼玛县| 昭通市| 衡阳县| 介休市| 游戏| 永顺县| 西畴县| 砚山县| 虎林市| 离岛区| 塔城市| 股票|