zoukankan      html  css  js  c++  java
  • 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
    ”, 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
    ", string(data))
    }
    

    说明

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

  • 相关阅读:
    娃娃机 解题报告
    ecshop
    多字节字符串 函数
    电商中设置满包邮,满减等促销搞活动;电商平台同步到第三方,日志记录
    PHP文件操作
    apache重写字段详细说明
    httpc服务器错误类型大全
    正则入门简易
    php100 编程小技巧
    memcache
  • 原文地址:https://www.cnblogs.com/fan-yi/p/13793664.html
Copyright © 2011-2022 走看看