golang-面向对象编程--结构体

面向对象编程--结构体

struct介绍

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

声明一个结构体,User结构体中,有属性:Username,Sex,Age,AvatarUrl,如果属性名称开头为小写字母,那么这个属性就是私有的,只能在当前包调用,不能挎包调用,和package中的私有函数,私有变量一致

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

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

struct(结构体)的实例化

方法一

var user User 
user.Age = 18
user.Username  = "user01"
user.Sex = "男"

在实例化化一个结构体的时候,就可以设置结构体内的属性值

没有设置的值,会默认为改类型的空值

方法二

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”,
}

struct(结构体) 赋值指针类型

和指针类型的赋值一样,语法:var 变量名 *结构体 ,在初始化的时候,需要指向结构体的内存地址

var user *User 
user = &User{}
fmt.Printf(“%p %#v\n”, user)

使用new方法,为结构体分配内存

var  user User=new(User)
user.Username = "user01"

结构体中的匿名字段

定义:在结构体中没有名字的字段

type User struct { 
 Username string
 Sex        string
 Age        int
 AvatarUrl  string
 int        // 直接是字段的类型,没有字段名
 string    // 直接是字段的类型,没有字段名
}

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

调用时候

var user User
user.int = 10
user.string = "1111"

结构体的嵌套

定义:其中的一个结构体中,拥有另一个结构体的属性

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

结构体User,拥有结构体Address中的所有属性

	var user User = User{
		Username: "user01",
		Age:      10,
		address: Address{
			City:     "bj",
			Province: "bj1",
		},
	}
	fmt.Printf("user info: Username : %s,Age: %d,City:%s,Province:%s", user.Username, user.Age, user.address.City, user.address.Province)

解决嵌套冲突

当一个结构体,嵌套了多个结构体的时候,比如C嵌套了A,也嵌套了B

  • C中有属性D的时候,使用C.D,操作这个属性的时候,会操作C的属性
  • C中没有属性D,A和B中都有属性D的时候,使用C.D,操作这个属性的时候,编译的时候回报错,原因是不能明确使用的A中的还是B中的属性,解决方法:C.A.D或者C.B.D,即使用哪个嵌套中的属性,就写哪个嵌套

结构体的tag

定义: 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以逗号隔开

tag的作用,是可以再json序列化的时候,定义json中key的值

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

func main() {
	user := User{
		Username: "user01",
		Age:      19,
		Sex:      "man",
	}
	data, _ := json.Marshal(user)
	fmt.Printf("user :  %s\n", string(data))
}

说明

由于结构体在操作的时候,需要注意是值变量的实例化,还是指针变量的实例化,如果是值变量的实例化,修改实例的属性会比较麻烦,一般使用指针实例化,去修改属性的内容

posted @ 2020-10-10 16:57  S小胖S  阅读(134)  评论(0编辑  收藏  举报