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
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      golang結構體-對象和指針-函數(shù)賦予-創(chuàng)新互聯(lián)

      1、定義一個結構體

      創(chuàng)新互聯(lián)公司客戶idc服務中心,提供成都服務器托管、成都服務器、成都主機托管、成都雙線服務器等業(yè)務的一站式服務。通過各地的服務中心,我們向成都用戶提供優(yōu)質廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務,資深網(wǎng)絡工程師在機房提供7*24小時標準級技術保障。
      type User struct {
          userid   int
          username string
          password string}

      2、初始化一個結構體

      有兩種情況,一是得到結構體的對象,一是得到結構的對象指針,分別有三種方式:

      golang結構體-對象和指針-函數(shù)賦予

       //第1種方式,先聲明對象,再初始化
          var player1 Player
          player1.userid = 1
          player1.username = "lina1"
          player1.password = "123456"
        
          //第2種方式,聲明同時初始化
          player2 := Player{2, "lina2", "123456"}
      
          //第3種方式,通過 field:value 形式初始化,該方式可以靈活初始化字段的順序
          player3 := Player{username: "lina3", password: "123456", userid: 3}
      
          //上面三種初始化方式都是生產(chǎn)對象的,相應如果想初始化得到對象指針的三種方法如下:
          //第1種方式,使用 new 關鍵字
          player4 := new(Player)
          player4.userid = 4
          player4.username = "lina4"
          player4.password = "123456"
      
          //第2種方式,聲明同時初始化
          player5 := &Player{5, "lina2", "123456"}
      
          //第3種方式,通過 field:value 形式初始化,該方式可以靈活初始化字段的順序
          player6 := &Player{username: "lina3", password: "123456", userid: 6}

      golang結構體-對象和指針-函數(shù)賦予

      3、對象與對象指針的區(qū)別(更確切的說應該是值類型和指針類型)

      與C/C++類似,GO語言也存在對象與對象的指針,但不同的是,GO語言中沒有 -> 操作符來調用指針所屬的成員,而與一般對象一樣,都是使用 . 來調用。

      對于一個函數(shù)(或方法),如果函數(shù)的參數(shù)(或接收者)是對象指針時,表示此對象是可被修改的;相反的,如果是對象時,表示是不可修改的(但如果該對象本身就是引用類型,如 map\func\chan 等,則本質上是可以修改的)。所以一般的做法是,方法的接收者習慣性使用對象指針,而不是對象,一方面可以在想修改對象時進行修改,另一方面也減少參數(shù)傳遞的拷貝成本。

      另外,有一點尤為特殊,如果是作為函數(shù)的參數(shù),則函數(shù)定義時,是使用對象還是對象指針,是有本質區(qū)別的,在使用對象作為參數(shù)的函數(shù)中,不能傳入對象指針,同樣的,在使用對象指針作為參數(shù)的函數(shù)中,也不能傳入對象,否則編譯器會報錯。但如果是方法,則接收者定義為對象還是對象指針,都可以接收對象和對象指針的調用。下面我們來定義相關的函數(shù)和方法如下:

      golang結構體-對象和指針-函數(shù)賦予

      //傳入 Player 對象參數(shù)func print_obj(player Player) {
          //player.username = "new"  //修改并不會影響傳入的對象本身
          log.Println("userid:", player.userid)
      }//傳入 Player 對象指針參數(shù)func print_ptr(player *Player) {
          player.username = "new"
          log.Println("userid:", player.userid)
      }//接收者為 Player 對象的方法,方法接收者的變量,按照 GO 語言的習慣一般不用 this/self ,而是使用接收者類型的第一個小寫字母,可以看標準庫中的代碼風格。func (p Player) m_print_obj() {
          //p.username = "new"  //修改并不會影響傳入的對象本身
         log.Println("self userid:", p.userid) 
      } 
      
      //接收者為 Player 對象指針的方法func (p *Player) m_print_ptr() { 
        p.username = "new"   log.Println("self userid:", p.userid) 
      }

      golang結構體-對象和指針-函數(shù)賦予

         然后測試一下函數(shù)跟方法的調用:

      golang結構體-對象和指針-函數(shù)賦予

          print_obj(player2)
          //print_ptr(player2)        //無法調用,編譯出錯    player2.m_print_obj()
          player2.m_print_ptr()
      
          //print_obj(player6)        //無法調用,編譯出錯
          print_ptr(player6) 
          player6.m_print_obj()
          player6.m_print_ptr()

      golang結構體-對象和指針-函數(shù)賦予

         既然對于對象與對象指針的區(qū)別,方法的處理很特殊,那么將一個對象傳入到接收者為對象指針的方法中,及將一個對象指針傳入到一個接收者為對象的方法中,能不能修改傳入對象的值呢?答案是,由方法的定義決定,而不是方法的調用者類型決定。

      4、匿名字段

      結構體里的字段可以只有類型名,而沒有字段名,這種字段稱為匿名字段。匿名字段可以是一個結構體、切片等復合類型,也可以是 int 這樣的簡單類型。但建議不要把簡單類型作為匿名字段。

      golang結構體-對象和指針-函數(shù)賦予

      type Pet struct {
          id      int
          petname string}
      
      type Player struct {
          id int
          Pet
          int}
      
      func main() {
          var player1 Player
          player1.petname = "pet1" //可以直接訪問匿名字段中的成員,就像訪問自己的成員一樣
          player1.int = 3          //一般不推薦將簡單類型作為匿名字段,如果有多個匿名的int,這里就沒法處理了
          player1.id = 1           //如果外層跟內層字段名重復的話,優(yōu)先取外層字段
          player1.Pet.id = 10      //如果外層跟內層字段名重復的話,可以通過這種形式來訪問內層字段}

      golang結構體-對象和指針-函數(shù)賦予

      一個命名為S的結構體類型將不能再包含S類型的成員:因為一個聚合的值不能包含它自身。(該限制同樣適應于數(shù)組。)但是S類型的結構體可以包含*S指針類型的成員,這可以讓我們創(chuàng)建遞歸的數(shù)據(jù)結構,比如鏈表和樹結構等。

      如果結構體沒有任何成員的話就是空結構體,寫作struct{}。它的大小為0,也不包含任何信息,但是有時候依然是有價值的。有些Go語言程序員用map帶模擬set數(shù)據(jù)結構時,用它來代替map中布爾類型的value,只是強調key的重要性,但是因為節(jié)約的空間有限,而且語法比較復雜,所有我們通常避免避免這樣的用法。

      seen := make(map[string]struct{}) // set of strings// ...if _, ok := seen[s]; !ok {
         seen[s] = struct{}{}
         // ...first time seeing s...
      }

      結構體可以作為函數(shù)的參數(shù)和返回值,如果結構體較大,一般使用指針參數(shù),而且如果要在函數(shù)修改結構體,則必須使用指針形式。go語言中所有的函數(shù)參數(shù)都是值拷貝。

      如果結構體的全部成員都是可比較的,則該結構體也可比較,則可作為Map的key類型。

      得意于匿名嵌入的特性,我們可以直接訪問葉子屬性而不需要給出完整的路徑:


      var w Wheel
      w.X = 8            // equivalent to w.Circle.Point.X = 8
      w.Y = 8            // equivalent to w.Circle.Point.Y = 8
      w.Radius = 5       // equivalent to w.Circle.Radius = 5
      w.Spokes = 20
       

      不幸的是,結構體字面值并沒有簡短表示匿名成員的語法, 因此下面的語句都不能編譯通過:


      w = Wheel{8, 8, 5, 20}                       // compile error: unknown fields
      w = Wheel{X: 8, Y: 8, Radius: 5, Spokes: 20} // compile error: unknown fields


      到目前為止,我們看到匿名成員特性只是對訪問嵌套成員的點運算符提供了簡短的語法糖。稍后,我們將會看到匿名成員并不要求是結構體類型;其實任何命令的類型都可以作為結構體的匿名成員。但是為什么要嵌入一個沒有任何子成員類型的匿名成員類型呢?

      答案是匿名類型的方法集。簡短的點運算符語法可以用于選擇匿名成員嵌套的成員,也可以用于訪問它們的方法。實際上,外層的結構體不僅僅是獲得了匿名成員類型的所有成員,而且也獲得了該類型導出的全部的方法。這個機制可以用于將一個有簡單行為的對象組合成有復雜行為的對象。組合是Go語言中面向對象編程的核心

      結體體定義時,可以為每一個字段添加一個 Tag,比如使用內置Json庫時,就可能用到這個Tag。具體看元數(shù)據(jù)和反射。

      另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


      本文標題:golang結構體-對象和指針-函數(shù)賦予-創(chuàng)新互聯(lián)
      當前鏈接:http://www.ef60e0e.cn/article/gishp.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>

        双辽市| 天全县| 商南县| 彰化县| 大宁县| 措美县| 收藏| 浦县| 黔江区| 五常市| 阳原县| 蓝山县| 阜新| 保德县| 固始县| 娄底市| 潮州市| 安阳市| 佳木斯市| 新密市| 荥经县| 绥滨县| 拉萨市| 鄂温| 潞西市| 淮阳县| 房山区| 衡南县| 河东区| 阳东县| 富锦市| 焦作市| 阳朔县| 文登市| 赣州市| 吴江市| 龙胜| 肥东县| 马公市| 阿拉善盟| 奉化市|