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

【go从零单排】go中的结构体struct和method

挪威特罗姆瑟夜景

Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

概念

struct

在Go语言中,结构体(struct)是一种用户定义的数据类型,用于将相关的数据组合在一起。
结构体可以包含多个字段,每个字段可以具有不同的数据类型。
结构体是Go语言中组织和管理数据的基本方式之一。

代码

struct

package main

import "fmt"

// 在代码中定义了一个名为 person 的结构体,包含两个字段:name(字符串类型)和 age(整数类型)
type person struct {
	name string
	age  int
}

// 定义构造函数newPerson,输入一个string,输出person结构体的指针
func newPerson(name string) *person {
	//定义变量,把person的name字段设置为传入的name,赋值给p
	p := person{name: name}
	p.age = 42 //p的age设置为42
	return &p  //返回p的内存地址
}

func main() {
	//创建一个新的结构,按位置赋值
	fmt.Println(person{"Bob", 20})
	//创建一个新的结构,按字段名称赋值
	fmt.Println(person{name: "Alice", age: 30})
	//只赋值name,age不赋值时会被初始化为0
	fmt.Println(person{name: "Fred"})
	//用&表示指针,打印结果带有&
	fmt.Println(&person{name: "Ann", age: 40})
	//在构造函数中初始化结构
	fmt.Println(newPerson("Jon"))
	//使用.name访问结构体字段
	s := person{name: "Sean", age: 50}
	fmt.Println(s.name)
	//把.与结构体指针一起使用,指针会自动取消引用,这里会输出age的值
	sp := &s
	fmt.Println(sp.age)
	//结构体是可变的,这里改变age的值
	sp.age = 51
	fmt.Println(sp.age)
	//创建dog结构体,字段为name string类型,isGood 布尔类型
	//注意这里省略了type,直接用dog并赋值
	dog := struct {
		name   string
		isGood bool
	}{
		"Rex",
		true,
	}
	//上面的代码为匿名结构体,临时使用一次或者测试时用
	fmt.Println(dog)
}

method

package main

import "fmt"

// 定义结构体
type rect struct {
	width, height int
}

// 定义方法area,输入为指向rect结构体的指针,输出一个int
func (r *rect) area() int {
	return r.width * r.height //计算面积
}

// 注意看这里没有*,输入为rect结构体
func (r rect) perim() int {
	return 2*r.width + 2*r.height //计算周长perim
}

func main() {
	//给结构体r赋值
	r := rect{width: 10, height: 5}

	fmt.Println("area: ", r.area())
	fmt.Println("perim:", r.perim())
	//变量rp赋值为指向r的指针,这样做可以避免改变r的结构体
	rp := &r
	fmt.Println("area: ", rp.area())
	fmt.Println("perim:", rp.perim())
}

嵌套struct

package main

import "fmt"

// 定义address结构体
type Address struct {
	City    string
	State   string
	ZipCode string
}

// 定义person结构体,嵌套了address
type Person struct {
	Name    string
	Age     int
	Address Address // 嵌套结构体
}

func main() {
	
	person := Person{
		Name: "David",
		Age:  40,
		//这里可以直接使用嵌套的结构
		Address: Address{
			City:    "New York",
			State:   "NY",
			ZipCode: "10001",
		},
	}

	fmt.Println(person.Address.City) // 输出: New York
}

理解

  • 结构体的定义使用 type 关键字,后跟结构体名称和字段的定义。字段的定义包括字段名和字段类型。
  • 如果结构体只有一次使用,比如测试时,可以不给结构体名称,直接赋值
  • 通过点(.)操作符访问结构体的字段
  • go支持在结构类型上定义method,意味着可以使用创建的结构体作为输入/输出
  • 可以使用嵌套struct

无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/384269.html

相关文章:

  • java高频基础选择题20道(一)
  • 123456
  • xrc的比赛
  • HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别
  • 【WPF】把一个Window放在左上角/右上角顶格显示
  • A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现
  • Python中的多线程效率分析
  • 基于YOLOv8 Web的安全帽佩戴识别检测系统的研究和设计,数据集+训练结果+Web源码
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
  • java访问华为网管软件iMaster NCE的北向接口时传递参数问题
  • Java基础概览和常用知识(二十一)
  • JS常用数组方法 reduce filter find forEach
  • Qt项目实战:银行利息(贷款)计算器
  • android camera data -> surface 显示
  • 北京美信时代渠道代理:运维后期维保服务策略
  • element-plus按需引入报错AutoImport is not a function
  • 利用Python 的爬虫技术淘宝天猫销量和库存
  • 基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
  • 「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现
  • Zabbix监控架构
  • 提示工程(Prompt Engineering):大模型微调Prompt/Instruct Mode;稀疏向量与稠密向量进行词语编码
  • Scala访问控制权限详解与应用实践 #Scala #scala
  • 履带机器人(一、STM32控制部分--标准库)
  • MyBatis项目的创建和增删查改操作
  • 计算机的发展史
  • 动漫风格大模型和lora推荐