zoukankan      html  css  js  c++  java
  • 【原创】go语言学习(十二)struct介绍1

    目录:

    • struct声明和定义
    • struct的内存布局以及构造函数
    • 匿名字段和struct嵌套
    • struct与tag应用

    struct声明和定义

    1、Go中面向对象是通过struct来实现的, struct是用户自定义的类型。

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

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

    2、struct初始化⽅方法1

    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
    ”, user)
    

      

    5、结构体类型的指针

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

      

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

      

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

      

    struct的内存布局以及构造函数

    1、结构体的内存布局: 占用一段连续的内存空间

     2、结构体没有构造函数, 必要时需要自己实现

    package main
    
    import "fmt"
    
    // struct定义
    type User struct {
    	Username  string
    	Sex       int
    	Age       int
    	AvatarUrl string
    }
    
    func main() {
    	// 初始化
    	var user User
    	user.Age = 18
    	user.AvatarUrl = "http://baidu.com/image/xxx.jpg"
    	user.Sex = '男'
    	user.Username = "user01"
    
    	fmt.Printf("user.username=%s age=%d sex=%s avatar=%s
    ", user.Username, user.Age, user.Sex, user.AvatarUrl)
    
    	// 初始化方法2
    	var user2 = User{
    		Username:  "user02",
    		Age:       18,
    		Sex:       '女',
    		AvatarUrl: "http://xxx.baidu.com/image/xxx.jpg",
    	}
    
    	fmt.Printf("user2=%#v
    ", user2)
    
    }
    

      

    匿名字段和struct嵌套

    1、匿名字段: 即没有名字的字段

    type User struct {
        Username string
        Sex string
        Age int
        AvatarUrl string
    }
    
    // 匿名字段
    type User struct {
        Username string
        Sex string
        Age int
        AvatarUrl string
        int
        string
    }
    

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

    2、结构体嵌套

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

      

    3、匿名结构体

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

      

    4、匿名结构体与继承

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

      

    5、冲突解决

    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
    }
    

      

    struct与tag应用

    1、字段可见性,大写表示可公开访问,小写表示私有

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

      

    2、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以逗号隔开。

  • 相关阅读:
    面试题-酷家乐面试准备
    英语学习-第一次申请试译的小透明(未完待续)
    操作系统educative版本-笔记1
    周末日记-第一次相对正规的技术教学
    资料推荐-一个神奇的网站educative.io
    面试题-持续集成
    每天5分钟玩转容器技术-读书笔记-第六章
    每天5分钟玩转容器技术-读书笔记-第四章到第五章
    工作日记-文件柜驱动层开发总结
    DP套题练习1
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/11808988.html
Copyright © 2011-2022 走看看