十一、結構體(基礎)

1.自定義類型

package main

import "fmt"

type Counter int
type users map[string]string
type Callback func(...string)
//後面可以跟任意類型
func main() {
   var age Counter
   fmt.Println(age)
   age = 200
   fmt.Println(age)

   me := make(users)
   me["name"] = "aa"
   me["addr"] = "北京"
   fmt.Printf("%T %T\n", age, me)
   var age2 int = 1
   //定義過的類型不能跟其他類型直接比較 需要做類型轉換纔可以作比較
   fmt.Println(age > Counter(age2))
   fmt.Println(int(age) > age2)
   //簽名必須相同
   var list Callback = func(args ...string) {
      for index, v := range args {
         fmt.Println(index, v)
      }
   }
   list("a", "b", "c")

}

2. 定義&聲明&初始化&New函數

結構體定義使用 struct 標識,需要指定其包含的屬性(名和類型),在定義結構體時可以爲 結構體指定結構體名(命名結構體),用於後續聲明結構體變量使用

package main

import (
   "fmt"
   "time"
)

//結構體的零值並不是nil 而是所有子元素的零值 組成的
type Users struct {
   ID   int
   name string
   tel  int
   bir  time.Time
}

func main() {
   var user Users
   fmt.Printf("%T\n", user)
   fmt.Printf("%#v\n", user)
   //字面量初始化
   //根據順序填寫,少一個都會報錯
   var user2 Users = Users{5, "aa", 192168, time.Now()}
   fmt.Printf("%#v\n", user2)

   //零值初始化
   var user3 Users = Users{}
   fmt.Printf("%#v\n", user3)
   //用指定屬性名 賦值 可以省略一部分值也可以 更換賦值順序
   //如果使用這種方法定義切記最後一個也需要加逗號 不然會報錯
   var user4 Users = Users{
      name: "aa",
      ID:   5,
   }
   fmt.Printf("%#v\n", user4)
   //定義一個結構體的指針類型  定義不初始化 是nil
   var pointer1 *Users
   fmt.Printf("%T\n", pointer1)
   fmt.Printf("%#v\n", pointer1)
   //初始化值  定義一箇中間變量獲取它的指針進行賦值
   var pointer2 *Users = &user2
   fmt.Printf("%T\n", pointer2)
   fmt.Printf("%#v\n", pointer2)
   //初始化零值 是返回所有元素的零值
   var pointer3 *Users = &Users{}
   fmt.Printf("%T\n", pointer3)
   fmt.Printf("%#v\n", pointer3)
   //new創建一個類型的指針類型
   var pointer4 *Users = new(Users)
   fmt.Printf("%T\n", pointer4)
   fmt.Printf("%#v\n", pointer4)
   fmt.Println(pointer4.ID)
   fmt.Println((*pointer4).ID)
   //new是獲取一個指針   map根slice 映射和切片一般用make  引用類型
   var aaa *int = new(int)
   fmt.Printf("%T\n", aaa)
   fmt.Printf("%#v\n", aaa)

}

3.屬性的訪問和修改

package main

import (
   "fmt"
)

type User struct {
   ID   int
   name string
   tel  int
}

func main() {
   var user User = User{
      name: "aa",
      ID:   5,
      tel:  192168,
   }
   fmt.Println(user.name, user.ID, user.tel)
   user.tel = 1111111
   fmt.Println(user.name, user.ID, user.tel)
   user2 := &User{
      name: "aa",
      ID:   5,
      tel:  192168,
   }
   fmt.Println(*user2)
   //2種修改方法都可以,直接拿指針. 他背後也是解引用 然後修改
   (*user2).tel = 12
   user2.ID = 6
   fmt.Println(*user2)
}

4.匿名結構體

在定義變量時將類型指定爲結構體的結構,此時叫匿名結構體。匿名結構體常用於初始化一 
次結構體變量的場景
package main

import "fmt"

func main() {
   //匿名結構體
   var user struct {
      ID   int
      name string
      tel  int
   }
   fmt.Printf("%T\n", user)
   fmt.Printf("%#v\n", user)
   user.ID = 222
   fmt.Printf("%#v\n", user)

   user2 := struct {
      ID   int
      name string
      tel  int
   }{1, "aa", 123456}
   //這裏也可以使用命名  xxx:x
   fmt.Printf("%#v\n", user2)

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章