Bootstrap

Go:struct

struct声明和定义

1. Go中⾯向对象是通过struct来实现的, struct是⽤户⾃定义的类型

type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
}

            注意:type是⽤来定义⼀种类型

2. struct初始化⽅法

var user User
user.Age = 18
user.Username = “user01”
user.Sex = “男”
user.AvatarUrl = “http://my.com/xxx.jpg"

            注意:使⽤变量名+ ‘.’ + 字段名访问结构体中的字段

3. struct初始化⽅法2

var user User = User {
    “Username” : “user01”,
    “Age”: 18,
    “Sex”: “男”,
    “AvatarUrl”: “http://my.com/xxx.jpg”,
}

            注意:也可以部分初始化

            更简单的写法:

user := User {
    “Username” : “user01”,
    “Age”: 18,
    “Sex”: “男”,
    “AvatarUrl”: “http://my.com/xxx.jpg”,
}

4. struct初始化的默认值

var user User
fmt.Printf(“%#v\n”, user)

5. 结构体类型的指针

var user *User = &User{}
fmt.Printf(“%p %#v\n”, user)
var user *User = &User {
    “Username” : “user01”,
    “Age”: 18,
    “Sex”: “男”,
    “AvatarUrl”: “http://my.com/xxx.jpg”,
}

注意:&User{}和new(User) 本质上是⼀样的,都是返回⼀个 结构体的地址

var user User = new(User)
user.Age = 18
user.Username = “user01”
user.Sex = “男”
user.AvatarUrl = “http://my.com/xxx.jpg"

struct内存布局

6. 结构体的内存布局: 占⽤⼀段连续的内存空间

7. 结构体没有构造函数, 必要时需要⾃⼰实现

匿名字段和嵌套

8. 匿名字段: 即没有名字的字段

type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
}
type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
     int
     string
}

注意:匿名字段默认采⽤类型名作为 字段名

9. 结构体嵌套

type Address struct {
     City string
     Province string
}
type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
     address Address
}

10.匿名结构体

type Address struct {
     City string
     Province string
}
type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
     Address
}

11.匿名结构体与继承

type Animal struct {
     City string
     Province string
}
type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
     Address
}

匿名字段和嵌套

12. 冲突解决

type Address struct {
     City string
     Province string
     CreateTime string
}
type Email struct {
     Account string
     CreateTime string
}

 

type User struct {
     Username string
     Sex string
     Age int
     AvatarUrl string
     Address
     Email
     CreateTime string
}

结构体与tag应用

13.字段可⻅性,⼤写表示可公开访问,⼩写表示私有

type User struct {
     Username string
     Sex string
     Age int
     avatarUrl string
     CreateTime string
}

14. tag是结构体的元信息,可以在运⾏的时候通过反射的机制读取出来

type User struct {
     Username string `json:”username”,db:”user_name”`
     Sex string `json:”sex”`
     Age int `json:”age”`
     avatarUrl string
     CreateTime string
}

字段类型后⾯,以反引号括起来的 key-value结构的字符串,多个tag 以逗号隔开。

方法的定义

1. 和其他语⾔不⼀样,Go的⽅法采⽤另外⼀种⽅式实现。

2. Go的⽅法是在函数前⾯加上⼀个接受者,这样编译器就知道这个⽅法属于哪个 类型了

3. 可以为当前包内定义的任何类型增加⽅法

函数和方法的区别

4. 函数不属于任何类型,⽅法属于特定的类型

值类型和指针类型

5. 指针类型作为接受者

6. 指针类型和值类型作为接受者的区别

7. 什么时候⽤值类型/指针类型作为接受者?

            A. 需要修改接受者中的值的时候

            B. 接受者是⼤对象的时候,副本拷⻉代价⽐较⼤

            C. ⼀般来说,通常使⽤指针类型作为接受者

匿名字段与继承

8. 匿名结构体与继承

type Animal struct {
     Name string
}
type People struct {
     Sex string
     Age int
     Animal //or *Animal
}

9. 多重继承与冲突解决

type Mother struct {
 Name string
}
type Father struct {
     Name string
}
type People struct {
     Sex string
     Age int
     *Mother
     *Father
}

结构体与json序列化

10.结构体序列化:结构体转成json数据格式

type People struct {
     Sex string
     Age int
     *Mother
     *Father
}

11.结构体反序列化:json数据格式转成结构体

 

 

 

 

 

 

 

 

;