go语言中的结构体

文章目录

go语言中的结构体

概述

​ 结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。

结构体类型

​ 有时我们需要将不同类型的数据组合成一个有机的整体

结构体初始化

go 复制代码
type Student struct {
    id   int
    name string
    sex  byte
    age  int
    addr string
}

func main() {
    //1、顺序初始化,必须每个成员都初始化
    var s1 Student = Student{1, "Luffy", 'm', 18, "EastSea"}
    s2 := Student{2, "Sanji", 'f', 20, "EastSea"}

    //2、指定初始化某个成员,没有初始化的成员为零值
    s4 := Student{id: 2, name: "Zoro"}
    
    
  
}

指针变量

go 复制代码
type Student struct {
    id   int
    name string
    sex  byte
    age  int
    addr string
}

func main() {
    var s5 *Student = &Student{3, "Nami", 'm', 16, "EastSea"}
    s6 := &Student{4, "ro", 'm', 3, "NorthSea"}
}

使用结构体成员

在Go语言中,普通结构体变量 和 结构体指针变量发访问成员的方法一致

  • 普通变量
go 复制代码
 //===============结构体变量为普通变量
    //1、打印成员
    var s1 Student = Student{1, "Luffy", 'm', 18, "EastSea"}
    //结果:id = 1, name = Luffy, sex = m, age = 18, addr = EastSea
    fmt.Printf("id = %d, name = %s, sex = %c, age = %d, addr = %s\n", s1.id, s1.name, s1.sex, s1.age, s1.addr)

    //2、成员变量赋值
    var s2 Student
    s2.id = 2
    s2.name = "Sanji"
    s2.sex = 'f'
    s2.age = 16
    s2.addr = "EastSea"
    fmt.Println(s2) //{2 yoyo 102 16 EastSea}
  • 指针变量
go 复制代码
//===============结构体变量为指针变量
    //1、先分配空间,再赋值
    s3 := new(Student)
    s3.id = 3
    s3.name = "Nami"
    fmt.Println(s3) //&{3 Nami 0 0 }

    //2、普通变量和指针变量类型打印
    var s4 Student = Student{4, "Sanji", 'm', 18, "EastSea"}
    fmt.Printf("s4 = %v, &s4 = %v\n", s4, &s4) 
	//s4 = {4 Sanji 109 18 sz}, &s4 = &{4 Sanji 109 18 EastSea}

    var p *Student = &s4
    //p.成员 和(*p).成员 操作是等价的
    p.id = 5
    (*p).name = "ro"
    fmt.Println(p, *p, s4) 
	//&{5 ro 109 18 EastSea} {5 ro 109 18 EastSea} {5 ro 109 18 EastSea}

结构体比较

如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用 == 或 != 运算符进行比较,但不支持 > 或 < 。

go 复制代码
func main() {
    s1 := Student{1, "Luffy", 'm', 18, "EastSea"}
    s2 := Student{1, "Luffy", 'm', 18, "EastSea"}

    fmt.Println("s1 == s2", s1 == s2) //s1 == s2 true
    fmt.Println("s1 != s2", s1 != s2) //s1 != s2 false
}

结构体作函数参数

值传递-不推荐使用

go 复制代码
func printValue(stu Student) {
    stu.id = 250
    //printValue stu =  {250 Luffy 109 18 s EastSea}
    fmt.Println("printValue stu = ", stu)
}

func main() {
var s Student = Student{1, "Luffy", 'm', 18, "EastSea"}

    printValue(s)        //值传递,形参修改不会影响到实参值
    fmt.Println("main s = ", s) //main s =  {1 Luffy 109 18 EastSea}
}

引用传递

go 复制代码
func printPointer(p *Student) {
    p.id = 250
    //printPointer p =  &{250 Luffy 109 18 EastSea}
    fmt.Println("printPointer p = ", p)
}

func main() {
    var s Student = Student{1, "Luffy", 'm', 18, "EastSea"}

    printPointer(&s)      //传引用(地址),形参修改会影响到实参值
    fmt.Println("main s = ", s) //main s = {250 Luffy 109 18 EastSea}
}
  • 结构体传参数的时候是值传递,如果需要引用传递的 话传对象指针
  • 结构体之间能够进行比较,但是只能进行等于或者是不等于的比较
相关推荐
叫我:松哥5 小时前
基于flask仿小米商城管理系统,使用flask开的一个商场网站
数据库·后端·python·flask
Wang's Blog5 小时前
Vibe Coding一人即团队系列35: 基于Claude Code的Spring Boot项目初始化实践
java·spring boot·后端
开开心心就好5 小时前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
zx_741484815 小时前
【Python入门】爬虫实战:Requests + XPath 从基础到实战
开发语言·爬虫·python
2601_962065255 小时前
从零创建一个 Django 项目
后端·python·django
吴声子夜歌5 小时前
Java——开发中通用的方法和准则(二)
java·开发语言·php
江屿风6 小时前
C++OJ题经验总结(竞赛)5
开发语言·c++
溪语流沙6 小时前
【Python项目实战】虚拟环境与依赖管理:venv / pip / requirements.txt实操
开发语言·python·pip
神威难绷泪6 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
Elastic 中国社区官方博客6 小时前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化