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

前进的中浪 · · 186 次点击 · · 开始浏览    

面向对象编程--结构体

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

说明

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


有疑问加站长微信联系

本文来自:简书

感谢作者:前进的中浪

查看原文:golang-面向对象编程--结构体

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

186 次点击  
加入收藏 微博
上一篇:九二一
下一篇:开篇辟地
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传