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)
}