当前位置: 首页 > news >正文

【Go】结构体的基本使用

go语言不是面向对象的语言
但是结构体类似于面向对象

结构体的定义

package main

import "fmt"

type Student struct {
	id     int
	name   string
	age    int
	school string
}

func main() {
	s := Student{1, "luobozi", 18, "znl"}
	fmt.Println(s)
}

结构体实例化(指针类型)

package main

import "fmt"

type Student struct {
	id   int
	name string
}

func main() {
	// 使用 & 进行实例化
	stu := &Student{id: 1, name: "luobozi"}
	fmt.Println((*stu).name) // 通过指针访问字段
	fmt.Println(stu.name)    // 语法糖,自动解引用
}

结构体实例化(值类型)

package main

import "fmt"

type Student struct {
	id   int
	name string
}

func main() {
	// 值类型实例化 不加 & 符号
	stu := Student{id: 1, name: "luobozi"}
	fmt.Println(stu)
}

使用 new 进行实例化

new(T) 分配 T 类型的零值 并返回 指向该零值的指针 *T
适用于 值类型(如 struct、array 等)。
只分配内存,不进行额外初始化。

package main

import "fmt"

type Student struct {
	name string
	age  int
}

func main() {
	stu := new(Student) // 分配 Student 类型的零值
	fmt.Printf("%+v\n", stu) // 输出:&{name: age:0}

	stu.name = "Alice"
	stu.age = 20
	fmt.Printf("%+v\n", stu) // 输出:&{name:Alice age:20}
}


结构体的值传递与指针传递

package main

import "fmt"

type Student struct {
	id   int
	name string
	age  int
}

func test(s Student) {
	fmt.Println("传递值")
	s.age = 100
}

func test1(s *Student) {
	fmt.Println("传递指针")
	s.age = 200
}

func main() {
	stu := Student{id: 1, name: "luobozi", age: 18}

	test(stu)
	fmt.Println("调用 test 后:", stu)

	test1(&stu)
	fmt.Println("调用 test1 后:", stu)
}

结构体方法(值接收者和指针接收者)

package main

import "fmt"

type Student struct {
	name string
}

func (s Student) ChangeName(name string) {
	fmt.Println("值接收者:", name)
	s.name = name
}

func (s *Student) ChangeName2(name string) {
	fmt.Println("指针接收者:", name)
	s.name = name
}

func main() {
	stu := Student{name: "luobozi"}

	stu.ChangeName("Alice") // 不会修改原数据
	fmt.Println(stu)

	stu.ChangeName2("Bob") // 会修改原数据
	fmt.Println(stu)
}

匿名结构体

package main

import "fmt"

func main() {
	anon := struct {
		id   int
		addr string
	}{id: 10, addr: "长沙"}

	fmt.Println(anon)
}

匿名字段

package main

import "fmt"

type Person struct {
	string
	int
}

func main() {
	p := Person{"匿名", 20}
	fmt.Println(p)
}

空结构体

package main

import "fmt"

type Empty struct{}

func (e *Empty) Call() {
	fmt.Println("调用空结构体方法")
}

func main() {
	var e Empty
	e.Call()
}

空结构体用于集合

package main

import "fmt"

type Set map[string]struct{} //使用map为基本,创建set类型

func (s Set) Add(k string) {
	s[k] = struct{}{} //空结构体是不占用内存的,所以就用这种方式实现集合,本质上也是一个map
}

func main() {
	s := make(Set)
	s.Add("Go")
	s.Add("Python")

	fmt.Println(s)
}

结构体内存对齐

package main

import (
	"fmt"
	"unsafe"
)

type A struct {
	a int8
	b int64
	c int8
}

type B struct {
	a int8
	c int8
	b int64
}

func main() {
	fmt.Println("结构体 A 大小:", unsafe.Sizeof(A{})) //结构体 A 大小: 24
	fmt.Println("结构体 B 大小:", unsafe.Sizeof(B{})) //结构体 B 大小: 16
}

相关文章:

  • 2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force)
  • Java反序列化CommonsBeanutils无依赖打Shiro
  • 阿里的MNN源码如何编译成so文件,供Android调用
  • 为什么在外置容器时要保证打包方式是war包?
  • 常用的数据结构有哪些?在Go语言中如何定义其实例?
  • 【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注
  • ZigMa:一种DiT风格的Zigzag Mamba扩散模型
  • Stream 流中 flatMap 方法详解
  • ADB简单入门
  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog vscode 配置
  • 一、蓝绿、灰度、滚动发布有什么不同
  • 网络安全攻防万字全景指南 | 从协议层到应用层的降维打击手册(全程图表对比,包你看到爽)
  • 内存高级话题
  • 如何根据 CUDA 配置安装 PyTorch 和 torchvision(大模型 环境经验)
  • C++学习之nginx+fastDFS
  • 详解Springboot的启动流程
  • 【HarmonyOS NEXT】关键资产存储开发案例
  • 纯内网环境安装1Panel面板与商店应用
  • 版本控制器Git ,Gitee如何连接Linux Gitee和Github区别
  • 信号的捕捉(操作部分)
  • 中央宣传部、全国妇联联合发布2025年“最美家庭”
  • 美国调整对华加征关税
  • 董军同法国国防部长举行会谈
  • 铁路部门:确保沿线群众安全,焦柳铁路6个区段将陆续安装防护栅栏
  • 75万采购防火墙实为299元路由器?重庆三峡学院发布终止公告:出现违法违规行为
  • 2025年两岸关系研讨会在上海开幕