GO自定義類型與指針


指針
定義:將地址形象化的稱為“指針”。將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。一個指針變量指向了一個值的內存地址。意思是通過它能找到以它為地址的內存單元。一個指針變量指向了一個值的內存地址。
注意:Go語言支持指針類型*T,指針的指針**T,以及包含包名前綴的*package.T。
1、指針聲明
a) 聲明一個int類型指針
         var ip *int
         b)聲明一個string類型指針
         var sp *string
         c) 通過 := 語法來定義指針
               var str string = "oldboy"
               sp := &str    
         d)聲明一個int值的指針的指針變量(即,指針的指針)
          var p **int
         e) 聲明一個time.Time值的指針變量
          var t *time.Time

2、空指針
定義:當一個指針被定義后沒有分配到任何變量時,它的值為 nil。nil 指針也稱為空指針
注意:nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值

3、指針類型轉換

    注意:    
            a)Go語言是不允許兩個指針類型進行轉換的。
            b)unsafe.Pointer類型用於表示任意類型的指針。有4個特殊的只能用於Pointer類型的操作:
               1、 任意類型的指針可以轉換為一個Pointer類型值
               2、 一個Pointer類型值可以轉換為任意類型的指針
               3、 一個uintptr類型值可以轉換為一個Pointer類型值
               4、 一個Pointer類型值可以轉換為一個uintptr類型值
    

結構體
定義:結構體是由一系列具有相同類型或不同類型的數據構成的數據集合
特點:
1、用來自定義復雜數據結構
2、struct里面可以包含一個或多個字段(屬性)
3、struct類型可以定義方法,注意和函數的區分
4、struct類型是值類型
5、struct類型可以嵌套
6、結構體是用戶單獨定義的類型,不能和其他類型進行強制轉換
7、Go中的struct沒有構造函數,一般可以使用工廠模式來解決這個問題
8、我們可以為struct中的每個字段,寫上一個tag。tag可以通過反射的機制獲取,常用的場景就是json序列化和反序列化
9、訪問結構體成員, 用 "." 來連接,格式為:"結構體.成員名"
1、struct定義
a)定義一個新的數據類型,結構體中只有一個成員。
               type bigint int64
               type smallint int8         
         b) 定義一個新的數據類型,結構體中有多個成員
              type oldboy struct {
                     Linux  string
                     Python string
                     Golang string
               }         
         c) 定義一個新的數據類型,指向結構體的指針
              type Linux string
              type oldboy struct {
                      *Linux
               }

2、struct 初始化
注意:
有序初始化: 結構體中的多個成員的值,必須一一對應。
無序初始化: 結構體中的多個成員的值,無須一一對應,可初始化部分值。
a)方式一
1、定義
             type oldboy struct {
                  Linux  string
                  Python string
                  Golang string
             }    
            2、初始化
               var ordered = oldboy{"linux", "python", "golang"}  // 有序初始化
               var disordered = oldboy{Golang: "golang"}  // 無序初始化

b)方式二
1、定義
            type oldboy struct {
                  int
                  string
             }
            2、初始化
               two := new(oldboy) //同 var two *oldboy = new(oldboy)  //指針變量
               three := oldboy{1, "three"}
               four := oldboy{}
               five := &oldboy{}  //指針變量
               six := &oldboy{2, "six"} //同 var six *oldboy = &oldboy{2, "six"} //指針變量

c)結構體包含結構體初始化
1、定義
              type Person struct {
                  name string
                  age  int
                  addr string
               }
               type Employee struct {
                  Person //匿名字段
                  salary int
                  int           //用內置類型作為匿名字段
                  addr   string //類似於重載
               } 
            2、初始化
            em1 := Employee{
                  Person{"oldboy", 18, "北京"},
                  10,
                  100,
                  "首都",
             }

3、struct與tag應用
注意:tag聲明struct結構的時候,在屬性的右側用小米點括起來的內容叫標簽(Tag),
在轉換成其它數據格式的時候,會使用其中特定的字段作為鍵值,一般在序列化和反序列化使用
a)定義
            type User struct {
               UserId   int
               UserName string
            }
            type UserTag struct {
               UserId   int    `json:"user_id" bson:"user_id"`
               UserName string `json:"user_name" bson:"user_name"`
            }
         b)初始化
            user := &User{UserId: 1, UserName: "oldboy"}
            json_user, _ := json.Marshal(user)
            fmt.Printf("struct User echo : %v\n", string(json_user))

            user_tag := &UserTag{UserId: 1, UserName: "oldboy"}
            json_user_tag, _ := json.Marshal(user_tag)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM