十一、结构体(基础)

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)

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