1. 程式人生 > 其它 >Golang | 結構體的定義和使用

Golang | 結構體的定義和使用

Struct

struct(結構體)就是使用者自己定義的型別,一個結構體對應現實中的一個型別,和Java中的Class類相似,但是沒有Class類那麼複雜,沒有多型,繼承,封裝。只保留了最基礎的特性:組合。組合也只是形成最基本的複合型別。

初始化

自定義一個User型別,並且對這個User型別進行初始化。

  type User struct {
    Id int
    Name string
    age int
  }

  func initStruct() {
    u1 := new(User)							// 使用內建函式進行初始化
    u2 := User{}							// 直接初始化
    u3 := &User{1,"張三",10}	// 所有欄位順序初始化 不顯示指定欄位初始化的話,必須按順序對所有欄位進行賦值
    u4 := &User{Id: 1,age: 10}				// 指定欄位初始化
    fmt.Println(u1)	// &{0  0}
    fmt.Println(u2)	// {0  0}
    fmt.Println(u3)	// &{1 張三 10}
    fmt.Println(u4)	// &{1  10}
  }

型別初始化之後,如果結構體中的欄位沒有被賦值,就會被初始化該型別的零值。

我們在實際使用中,通常不使用以上的方式進行初始化結構體,一般使用一個建構函式來進行初始化:

func NewUser(id int,name string) *User {
	return &User{Id: id,Name: name}
}

fmt.Println(NewUser(2,"張三"))	// &{2 張三 0}

自定義的構體函式一般使用 New開頭,以結構體名稱結尾,初始化時,使用幾個引數傳入幾個引數,並且返回

可見性

結構體的可見性和包內變數是相同的,結構體名稱為首字母為大寫開頭,別的包可以引用,欄位的話,首字母為小寫只能包內可見,首字母大寫的話, 別的包也可見。

函名組合

  type User struct {
    Info
    Id   int
    Name string
    age  int
  }

  type Info struct {
    Introduction string
    Name         string
  }
  // 結構體組合
  func combination() {
    user := &User{Info{"組合類","李四"},1, "張三", 10}
    fmt.Println(user.Name)			// 組合中的同名欄位,不指定的話,取外部結構體的欄位
    fmt.Println(user.Info.Name)		// 組合中的同欄位,如果想取內部結構體的欄位,必須要指定內部結構體的名稱進行取值
    fmt.Println(user.Introduction)	// 如果內部組合中欄位名和外部沒有重複,可以直接取這個欄位輸出
  }

有介面的情況下,外部的結構體可以使用內部結構體的方法

如果這個結構體只使用一次,可以使用以下方法進行結構體的構造:

  type User struct {
    Info
    TInfo  struct{
      Name string	
    }
    Id   int
    Name string
    age  int
  }

帶標籤的結構休

我們在網路傳輸中,需要把一個結構體轉換為一個JSON字串進行傳輸,我們看一下,不加標籤的結構體轉換為JSON字串後的情況:

	user := &User{Id: 1, age: 10} // 指定欄位初始化
	
	fmt.Println(user)             // &{1  10}

	jsonUser, _ := json.Marshal(user)

	fmt.Println(string(jsonUser))	// {"Introduction":"","Id":1,"Name":""}

這樣也可以轉為JSON字串,但是不符合我們在不同應用中傳遞的規範,在Go中欄位名首字母為在寫,轉換後也是按照結構體的欄位進行輸出的。

如果我們想要符合規範,首字母小寫,並且兩個單詞之間使用 _連線,我們可以使用標籤對結構體進行修改:

type User struct {
	Info			`json:"info"`
	Id   int		`json:"id"`
	Name string		`json:"name"`
	age  int		`json:"age"`
}

type Info struct {
	Introduction string	`json:"introduction"`
	Name         string	`json:"name"`
}

{"info":{"introduction":"","name":""},"id":1,"name":""}

對結構體新增標籤後,我們輸出的JSON字串就標準了。



關注公眾號,隨時獲取最新資訊

細節決定成敗!
個人愚見,如有不對,懇請斧正!