26

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

 3 years ago
source link: https://studygolang.com/articles/30893
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

面向对象编程--结构体

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

说明

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

有疑问加站长微信联系

iiUfA3j.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK