Golang 结构体笔记

news2024/11/15 14:42:51

结构体是一个自定义的数据类型,是值类型

声明结构体

type 结构体名称 struct {

field_1 type

field_2 type

}

注意事项

  1. 字段声明语法同变量,示例:字段名 字段类型

  1. 字段的类型可以为:基本类型、数组或引用类型

  1. 创建一个结构体变量后,如果没有给字段赋值,都会对应一个默认值,规则如下:

  • 布尔类型默认为false

  • 数值类型默认为0

  • 字符串类型默认为空""

  • 数组类型的默认值与它的元素类型相关,比如:Scores [3]int 默认值为:[0,0,0]

  • 指针、切片(slice)、map默认值都是nil,即还没有分配空间

  1. 不同的结构体字段之间是独立的,互不影响,一个字段值的改变不会影响另外一个

基本使用

package main

import "fmt"

type Stu struct {
    Name  string
    Age   int
    Score float32
    Ptr   *int              // 指针
    Array [3]int            // 数组
    Slice []string          // 切片
    Map1  map[string]string // map
}

func main() {
    // 结构体基本使用
    var student Stu
    student.Name = "宋江"
    student.Age = 20
    student.Score = 60

    fmt.Println(student)
    // 单独访问变量
    fmt.Printf("Name:%v,Age:%v,Score:%v\n", student.Name, student.Age, student.Score)
    // 给数组赋值
    student.Array = [3]int{1, 2, 0}
    student.Array[2] = 3
    // 给切片赋值,切片赋值必须make!!!
    student.Slice = make([]string, 3)
    student.Slice[0] = "卢俊义"
    student.Slice[1] = "吴用"
    student.Slice[2] = "公孙胜"
    student.Slice = append(student.Slice, "林超") // 切片超过定义范围,再追加需用append函数
    // 给map赋值,map赋值必须make!!!
    student.Map1 = make(map[string]string)
    student.Map1["no1"] = "吃饭"
    student.Map1["no2"] = "睡觉"
    student.Map1["no3"] = "打游戏"
    fmt.Println(student)
}

不同的结构体字段之间是独立性

package main

import "fmt"

type Stu struct {
    Name  string
    Age   int
    Score float32
}

func main() {
    // 不同的结构体字段之间是独立的,互不影响
    var student1 Stu
    student1.Name = "宋江"
    student1.Age = 20
    student1.Score = 60

    student2 := student1
    student2.Score = 70 // 此处元素值的改变并不会影响student1
    fmt.Println(student1)
    fmt.Println(student2)
}

创建结构体实例的四种方式

看代码注释,推荐第二种方式

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 第一种方式
    var person1 Person
    person1.Name = "宋江"
    person1.Age = 20
    fmt.Println(person1)

    // 第二种方式
    var person2 = Person{
        Name: "吴用",
        Age:  19,
    }
    fmt.Println(person2)

    // 第三种方式,person3是指针类型
    var person3 *Person = new(Person) // *Person可以省略不写
    (*person3).Name = "卢俊义"           // 可以省略为:person3.Name = "卢俊义",(*person3)等价于person3
    (*person3).Age = 21               // 可以省略为:person3.Age = 21,(*person3)等价于person3
    fmt.Println(*person3)

    // 第四种,person4算指针类型,可以直接赋值,也可以重新赋值
    var person4 *Person = &Person{ // *Person可以省略不写
        Name: "公孙胜",
        Age:  22,
    }
    person4.Name = "林冲" // 重写赋值,标准写法:(*person4).Name = "林冲",这里使用的是省略方式
    person4.Age = 23    // 重写赋值,标准写法:(*person4).Age = 23,这里使用的是省略方式
    fmt.Println(*person4)
}

结构体指针的使用

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    var person = Person{
        Name: "宋江",
        Age:  19,
    }
    personPtr := &person  // 定义一个指针
    personPtr.Name = "吴用" // 修改指针的Name,personPtr是省略方式
    (*personPtr).Age = 20 // 修改指针的Age,*personPtr是指针标准方式
    fmt.Println(person)
    fmt.Println(*personPtr)
}

结构体细节

  1. 结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段(字段名、个数、类型)

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

type Person1 struct {
    Name string
    Age  int
}

func main() {
    var person = Person{
        Name: "宋江",
        Age:  19,
    }
    // var person1 Person1 = person // 这种直接赋值是不行的,需要做强转
    var person1 Person1 = Person1(person) // 强转的前提是两个结构体必须完全一样
    fmt.Println(person)
    fmt.Println(person1)
}
  1. 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转

package main

import "fmt"

type integer int // 新定义数据类型integer,相当于int的别名

func main() {
    var i integer = 10
    var j int
    // j = i // 直接赋值是不行,需要强转
    j = int(i)
    fmt.Println(i, "---", j)
}
  1. struct 的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景是json的序列化和反序列化

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"` // tag的作用是返回json后Name转换为name(首字母小写)
    Age  int    `json:"age"`
    As   string `json:"as"`
}

func main() {
    var persons = map[int]Person{
        0: {
            Name: "宋江",
            Age:  19,
            As:   "及时雨",
        },
        1: {
            Name: "吴用",
            Age:  20,
            As:   "神机军师",
        },
    }
    var personStr, err = json.Marshal(persons)
    if err != nil {
        fmt.Println("json转码错误", err)
    } else {
        fmt.Println(string(personStr))
    }
}

返回:{"0":{"name":"宋江","age":19,"as":"及时雨"},"1":{"name":"吴用","age":20,"as":"神机军师"}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城--品牌管理详情

目录 1.简单上传测试 2.Aliyun Spring Boot OSS 3.模块mall-third-service 4.前端 5.数据校验 6.JSR303数据校验 7.分组校验功能 8.自定义校验功能 9.完善代码 1.简单上传测试 OSS是对象存储服务,有什么用呢?把图片存储到云服务器上能让所有人…

杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法

主要介绍了JavaScript定时器设置、使用与倒计时案例,详细分析了javascript定时器的设置、取消、循环调用并附带一个倒计时功能应用案例,需要的朋友可以参考下&#xff1a; 运行效果图&#xff1a; 配套视频课程 基于JavaScript的红绿灯设计演示代码如下: <!DOCTYPE html>…

《Keras深度学习:入门、实战与进阶》之印第安人糖尿病诊断

本文摘自《Keras深度学习&#xff1a;入门、实战与进阶》。 1、数据理解 本节使用Pima Indians糖尿病发病情况数据集。该数据集最初来自国家糖尿病/消化/肾脏疾病研究所。数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测患者是否患有糖尿病。数据集由多个医学预…

python+django大学生成绩综合考评系统pycharm项目

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 通常 一个Django model 对应一张数据表&#xff0c;model是以类的形式表现的 实现了ORM 对象…

Unity SRP自定义渲染管线学习2.2: 合批(Batching) SRP Batcher

接下来我们要来学习下自定义渲染管线中的合批&#xff0c;这一节主要学习SRP Batcher 每一次的Draw Call都需要CPU和GPU之间的通信&#xff0c;如果有大量的数据需要从CPU发送到GPU中&#xff0c;那GPU就可能因为等待数据而浪费时间&#xff0c;而CPU会因为忙于发送数据导致无…

第五章:Windows server加域

加入AD域&#xff1a;教学视频&#xff1a;https://www.bilibili.com/video/BV1xM4y1D7oL/?spm_id_from333.999.0.0首先我们选择一个干净的&#xff0c;也就是新建的没动过的Windows server虚拟机。我们将DNS改成域的ip地址&#xff0c;还要保证它们之间能ping的通&#xff0c…

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…

opencv保存图片

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

SIGIR22:User-controllable Recommendation Against Filter Bubbles

User-controllable Recommendation Against Filter Bubbles 摘要 推荐系统经常面临过滤气泡的问题&#xff1a;过度推荐基于用户特征以及历史交互的同质化项目。过滤气泡将会随着反馈循环增长&#xff0c;缩小了用户兴趣。现有的工作通常通过纳入诸如多样性和公平性等准确性之…

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…

53. 最大子数组和

文章目录题目描述暴力法动态规划法分治法参考文献题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&…

JavaScript中数组常用的方法

文章目录前言常用数组方法1、 join( )2、push&#xff08;&#xff09;与 pop&#xff08;&#xff09;3、shift&#xff08;&#xff09;与 unshift&#xff08;&#xff09;4、sort&#xff08;&#xff09;5、reverse&#xff08;&#xff09;6、slice&#xff08;&#xff…

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II

一、参考资料复原IP地址题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解&#xff1a;https://programmercarl.com/0078.…

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 一个骰子&#xff0c;从3个不同角度看过去的点数如图所示&#xff0c;请问5的对面是什么点数&#xff1f;&#xff08; &#xff09; …

数据库(单表查询)

素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NOT NUL…

【C语言技能树】程序环境和预处理

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

一文掌握,单机Redis、哨兵和Redis Cluster的搭建,建议收藏

本篇文章讲述了 Redis 单机环境、主备、哨兵 Sentinel 模式以及 Redis Cluster 集群模式下的操作步骤&#xff0c;关于这些操作我们没必要死记硬背&#xff0c;只需要总结下来&#xff0c;下次使用直接拿出来就好。建议当作操作手册收藏。安装单实例 Redis编译Redis1.下载Redis…

小白都能学会的红帽(RedHat8)RHEL8系统安装实战

文章目录前言一. 实验环境二. 安装虚拟机三. 安装操作系统四. 系统安装成功后的操作总结前言 本文是应一位大佬的提议&#xff0c;建议我写写红帽系列&#xff0c;centos8已经不维护了&#xff0c;centos7 维护到2024年6月30日&#xff0c; 也就是明年的事情了&#xff0c;所以…

【Flutter入门到进阶】Dart基础篇---基于对比Java学习Dart

1 Dart语言特性 1.1 简介 1.1.1 说明 2011年10月&#xff0c;在丹麦召开的 GOTO 大会上&#xff0c;Google 发布了一种新的编程语言 Dart 。如同 Kotlin 和 Swift 的出现&#xff0c;分别是为了解决 Java 和 Objective-C 在编写应用程序的一些实际问题一样&#xff0c;Dart 的…