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

  • 相关阅读:
    P3396 哈希冲突
    P3295 [SCOI2016]萌萌哒
    P2585 [ZJOI2006]三色二叉树
    Leetcode 1546 和为目标值的最大数目不重叠非空子数组数目 贪心前缀和
    Leetcode 200 岛屿数量 压缩路径并查集与DFS
    Leetcode 递增子序列 回溯去重
    机器学习sklearn(76):算法实例(三十三)回归(五)线性回归大家族(三)回归类的模型评估指标
    机器学习sklearn(75):算法实例(三十二)回归(四)线性回归大家族(二)多元线性回归LinearRegression
    机器学习sklearn(74):算法实例(三十一)回归(三)线性回归大家族(一)概述
    机器学习sklearn(73):算法实例(三十)分类(十七)SVM(八)sklearn.svm.SVC(七) SVC真实数据案例:预测明天是否会下雨
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/11808988.html
Copyright © 2011-2022 走看看