go语言中的结构体

OKZTWO.exe 立即下载

结构(struct)

Go 通过类型别名和结构体的形式支持用户自定义类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 new 函数来创建。

组成结构体类型的那些数据称为 字段(fields)。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。

结构体定义

结构体定义的一般方式如下:

type identifier struct {
field1 type1
field2 type2
...
}

type T struct {a, b int} 也是合法的语法,它更适用于简单的结构体。
结构体里的字段都有 名字,像 field1、field2 等,如果字段在代码中从来也不会被用到,那么可以命名它为 _。

结构体的字段可以是任何类型,甚至是结构体本身,也可以是函数或者接口。可以声明结构体类型的一个变量,然后像下面这样给它的字段赋值:

var s T
s.a = 5
s.b = 8

数组可以看作是一种结构体类型,不过它使用下标而不是具名的字段。

使用 new

使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针: var t *T = new(T) .

var t *T
t = new(T)

写这条语句的惯用方法是: t := new(T) ,变量 t 是一个指向 T 的指针,此时结构体字段的值是它们所属类型的零值。
声明 var t T 也会给 t 分配内存,并零值化内存,但是这个时候 t 是类型T。

package main
import "fmt"
type struct1 struct {
i1 int
f1 float32
str string
}
func main() {
ms := new(struct1)
ms.i1 = 10
ms.f1 = 15.5
ms.str= "Chris"
fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The float is: %f\n", ms.f1)
fmt.Printf("The string is: %s\n", ms.str)
fmt.Println(ms)
}

输出:
The int is: 10
The float is: 15.500000
The string is: Chris
&{10 15.5 Chris}

使用 fmt.Println 打印一个结构体的默认输出可以很好的显示它的内容,类似使用 %v 选项。就像在面向对象语言所作的那样,可以使用点号符给字段赋值: structname.fieldname = value 。
同样的,使用点号符可以获取结构体字段的值: structname.fieldname 。

在 Go 语言中这叫 选择器(selector)。无论变量是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段:

type myStruct struct { i int }
var v myStruct // v是结构体类型变量
var p *myStruct // p是指向一个结构体类型变量的指针

v.i
p.i
初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下:

ms := &struct1{10, 15.5, "Chris"}
// 此时ms的类型是 *struct1
或者:
var mt struct1
ms := struct1{10, 15.5, "Chris"}

混合字面量语法(composite literal syntax) &struct1{a, b, c} 是一种简写,底层仍然会调用 new (),这里值的顺序必须按照字段顺序来写。

时间间隔(开始和结束时间以秒为单位)是使用结构体的一个典型例子:

type Interval struct {
start int
end int
}
//初始化方式:
intr := Interval{0, 3} (A)
intr := Interval{end:5, start:1} (B)
intr := Interval{end:5} (C)

在(A)中,值必须以字段在结构体定义时的顺序给出,& 不是必须的。(B)显示了另一种方式,字段名加一个冒号放在值的前面,这种情况下值的顺序不必一致,并且某些字段还可以被忽略掉,就像(C)中那样。

结构体类型和字段的命名遵循可见性规则,一个导出的结构体类型中有些字段是导出的,另一些不是,这是可能的。
下图说明了结构体类型实例和一个指向它的指针的内存布局:
type Point struct { x, y int }
使用 new 初始化:
在这里插入图片描述

作为结构体字面量初始化:
在这里插入图片描述

结构体的内存布局

Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体,这在性能上带来了很大的优势。

递归结构体

结构体类型可以通过引用自身来定义。这在定义链表或二叉树的元素(通常叫节点)时特别有用,此时节点包含指向临近节点的链接(地址)。如下所示,链表中的 su ,树中的 ri 和 le 分别是指向别的节点的指针。
链表:
在这里插入图片描述

这块的 data 字段用于存放有效数据(比如 float64), su 指针指向后继节点。

type Node struct {
data float64
su *Node
}

链表中的第一个元素叫 head ,它指向第二个元素;最后一个元素叫 tail ,它没有后继元素,所以它的su 为 nil 值。当然真实的链接会有很多数据节点,并且链表可以动态增长或收缩。
同样地可以定义一个双向链表,它有一个前趋节点 pr 和一个后继节点 su :

type Node struct {
pr *Node
data float64
su *Node
}

二叉树:
在这里插入图片描述

二叉树中每个节点最多能链接至两个节点:左节点(le)和右节点(ri),这两个节点本身又可以有左右节点,依次类推。树的顶层节点叫根节点(root),底层没有子节点的节点叫叶子节点(leaves),叶子节点的 le 和 ri 指针为 nil 值。在 Go 中可以如下定义二叉树:

type Tree strcut {
le *Tree
data float64
ri *Tree
}

结构体转换

Go 中的类型转换遵循严格的规则。当为结构体定义了一个 alias 类型时,此结构体类型和它的 alias 类型都有相同的底层类型.

package main
import "fmt"
type number struct {
f float32
}
type nr number // alias type
func main() {
a := number{5.0}
b := nr{5.0}
// var i float32 = b // compile-error: cannot use b (type nr) as type float32 in assignment
// var i = float32(b) // compile-error: cannot convert b (type nr) to type float32
// var c number = b // compile-error: cannot use b (type nr) as type number in assignment
// needs a conversion:
var c = number(b)
fmt.Println(a, b, c)
}

输出:
{5} {5} {5}

使用工厂方法创建结构体实例

结构体工厂

Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂“方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:

type File struct {
fd int // 文件描述符
name string // 文件名
}

下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:

func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
return &File(fd, name)
}

然后这样调用它:
f := NewFile(10, “./test.txt”)
在 Go 语言中常常像上面这样在工厂方法里使用初始化来简便的实现构造子。如果 File 是一个结构体类型,那么表达式 new(File) 和 &File{} 是等价的。

如果想知道结构体类型T的一个实例占用了多少内存,可以使用: size := unsafe.Sizeof(T{}) 。

如何强制使用工厂方法

通过应用可见性规则(参考第 4.2.1、9.5 节)就可以禁止使用 new 函数,强制用户使用工厂方法,从而使类型变成私有的,就像在面向对象语言中那样。

type matrix struct {
...
}
func NewMatrix(params) *matrix {
m := new(matrix) // 初始化 m
return m
}

在其他包里使用工厂方法:

package main
import "matrix"
...
wrong := new(matrix.matrix) // 编译失败(matrix 是私有的)
right := matrix.NewMatrix(...) // 实例化 matrix 的唯一方式

map 和 struct vs new() 和 make()

现在为止我们已经见到了可以使用 make() 的三种类型中的其中两个: slices / maps / channels
下面的例子来说明了在映射上使用 new 和 make 的区别,以及可能的发生的错误:

package main
type Foo map[string]string
type Bar struct {
thingOne string
thingTwo int
}
func main() {
// OK
y := new(Bar)
(*y).thingOne = "hello"
(*y).thingTwo = 1
// NOT OK
z := make(Bar) // 编译错误:cannot make type Bar
(*y).thingOne = "hello"
(*y).thingTwo = 1
// OK
x := make(Foo)
x["x"] = "goodbye"
x["y"] = "world"
// NOT OK
u := new(Foo)
(*u)["x"] = "goodbye" // 运行时错误!! panic: assignment to entry in nil map
(*u)["y"] = "world"
}

试图 make() 一个结构体变量,会引发一个编译错误,这还不是太糟糕,但是 new() 一个映射并试图使用数据填充它,将会引发运行时错误! 因为 new(Foo) 返回的是一个指向 nil 的指针,它尚未被分配内存。所以在使用 map 时要特别谨慎。

使用自定义包中的结构体

package structPack
type ExpStruct struct {
Mi1 int
Mf1 float32
}
package main
import (
"fmt"
"./struct_pack/structPack"
)
func main() {
struct1 := new(structPack.ExpStruct)
struct1.Mi1 = 10
struct1.Mf1 = 16.
fmt.Printf("Mi1 = %d\n", struct1.Mi1)
fmt.Printf("Mf1 = %f\n", struct1.Mf1)
}

输出:
Mi1 = 10
Mf1 = 16.000000

带标签的结构体

结构体中的字段除了有名字和类型外,还可以有一个可选的标签(tag):它是一个附属于字段的字符串,可以是文档或其他的重要标记。标签的内容不可以在一般的编程中使用,只有包 reflect 能获取它。我们将在下一章中深入的探讨 reflect 包,它可以在运行时自省类型、属性和方法,比如:在一个变量上调用 reflect.TypeOf() 可以获取变量的正确类型,如果变量是一个结构体类型,就可以通过Field 来索引结构体的字段,然后就可以使用 Tag 属性。

package main
import (
"fmt"
"reflect"
)
type TagType struct { // tags
field1 bool "An important answer"
field2 string "The name of the thing"
field3 int "How much there are"
}
func main() {
tt := TagType{true, "Barak Obama", 1}
for i := 0; i < 3; i++ {
refTag(tt, i)
}
}
func refTag(tt TagType, ix int) {
ttType := reflect.TypeOf(tt)
ixField := ttType.Field(ix)
fmt.Printf("%v\n", ixField.Tag)
}

输出:
An important answer
The name of the thing
How much there are

匿名字段和内嵌结构体

定义

结构体可以包含一个或多个 匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即 结构体可以包含内嵌结构体。
Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在 Go 语言中,相比较于继承,组合更受青睐。
考虑如下的程序:

package main
import "fmt"
type innerS struct {
in1 int
in2 int
}
type outerS struct {
b int
c float32
int // anonymous field
innerS //anonymous field
}
func main() {
outer := new(outerS)
outer.b = 6
outer.c = 7.5
outer.int = 60
outer.in1 = 5
outer.in2 = 10
fmt.Printf("outer.b is: %d\n", outer.b)
fmt.Printf("outer.c is: %f\n", outer.c)
fmt.Printf("outer.int is: %d\n", outer.int)
fmt.Printf("outer.in1 is: %d\n", outer.in1)
fmt.Printf("outer.in2 is: %d\n", outer.in2)
// 使用结构体字面量
outer2 := outerS{6, 7.5, 60, innerS{5, 10}}
fmt.Printf("outer2 is:", outer2)
}

输出:
outer.b is: 6
outer.c is: 7.500000
outer.int is: 60
outer.in1 is: 5
outer.in2 is: 10
outer2 is:{6 7.5 60 {5 10}}
通过类型 outer.int 的名字来获取存储在匿名字段中的数据,于是可以得出一个结论:在一个结构体中对于每一种数据类型只能有一个匿名字段。

内嵌结构体

同样地结构体也是一种数据类型,所以它也可以作为一个匿名字段来使用,如同上面例子中那样。外层结构体通过 outer.in1 直接进入内层结构体的字段,内嵌结构体甚至可以来自其他包。内层结构体被简单的插入或者内嵌进外层结构体。这个简单的“继承”机制提供了一种方式,使得可以从另外一个或一些类型继承部分或全部实现。

package main
import "fmt"
type A struct {
ax, ay int
}
type B struct {
A
bx, by float32
}
func main() {
b := B{A{1, 2}, 3.0, 4.0}
fmt.Println(b.ax, b.ay, b.bx, b.by)
fmt.Println(b.A)
}

输出:
1 2 3 4
{1 2}

命名冲突

当两个字段拥有相同的名字(可能是继承来的名字)时该怎么办呢?

  1. 外层名字会覆盖内层名字,这提供了一种重载字段或方法的方式
  2. 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发一个错误。没有办法来解决这种问题引起的二义性,必须由程序员自己修正。
type A struct {a int}
type B struct {a, b int}
type C struct {A; B}
var c C;

规则 2:使用 c.a 是错误的,到底是 c.A.a 还是 c.B.a 呢?会导致编译器错误:ambiguous DOT
reference c.a disambiguate with either c.A.a or c.B.a。
type D struct {B; b float32}
var d D;
规则1:使用 d.b 是没问题的:它是 float32,而不是 B 的 b 。如果想要内层的 b 可以通过 d.B.b得到。

uniapp串口通信实战:从零搭建物联网设备控制App(附完整代码) 本文详细介绍了如何使用Uniapp实现串口通信,从零搭建物联网设备控制App。内容涵盖环境配置、串口初始化、数据收发、错误处理等核心功能,并提供了完整的代码示例,帮助开发者快速掌握跨平台串口通信技术,适用于智能农业、工业自动化等物联网场景。 阅读详情

相关推荐

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 438

两个节点发布订阅消息

个人觉得超级帮的博客: 强烈推荐参考住这个!!! https://blog.youkuaiyun.com/ding977921830/article/details/70168877

1万+

fdtd(时域有限差分)仿真

基础入门阶段采用 Step by step 的教学方式带着做具体的案例,在案例中学习 FDTD 应用的。的痛难点,将 FDTD 仿真引入实验当中,通过软件可视化处理有效直观的展示仿真的流程,与实验数。图像传感器,OLED 和液晶,表面计量,表面等离子体,石墨烯,太阳能电池,集成光子组件,超材。料,衍射光学和光子晶体。波,场极化,磁场,周期性结构,半球功率积分等设计解决方案,提供时域有限差分分析函数,时域。子光学传感器、热电子光探测器的光学特性研究、光学微腔宽带吸收器等多个方向的研究方法。

y2715163545的博客 5454

OkHttp2.x简单使用说明

简介OkHttp是一款高效的HTTP请求框架,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还具有有透明的GZIP压缩,请求缓存等优势。配置依赖compile 'com.squareup.okhttp:okhttp:2.4.0'OkHttp内部依赖okio,需要同时导入okio:compile 'com.squareup.okio:okio:1.5.0'使用方式Http G

秋季的雨 7089

K8S 1.28.2 + Calico 3.27.3 保姆级安装避坑指南:解决节点NotReady问题

本文提供了一份详细的Kubernetes 1.28.2与Calico 3.27.3集群部署指南,重点解决节点NotReady这一常见问题。通过版本兼容性分析、精细化环境配置、kubeadm初始化参数详解及Calico Operator部署,手把手指导用户避开网络插件配置陷阱,确保集群从NotReady状态恢复健康并稳定运行。

weixin_28835583的博客 394

opencv图像去畸变

opencv图像去畸变

智能机器人产学研基地 4878

OKZTWO vs 传统开发:效率提升300%的秘密

工具会记录开发者从零开始完成特定任务的传统耗时,同时用AI生成相同功能的代码,自动对比两者的差异。输入简单的需求描述后,系统会自动生成符合最佳实践的目录结构和核心模块代码。实测一个React前端项目的初始化时间从原来的40分钟缩短到2分钟,且生成的代码自带ESLint配置和单元测试模板。当机器处理好80%的模板代码后,我们可以更专注于那些真正需要创造力的20%核心逻辑。在测试阶段发现,传统手工代码的平均缺陷率为每千行12个,而AI辅助代码仅有3个。上开发的,最惊喜的是它的部署体验。这个对比工具本身就是在。

ThunderstormLynx23的博客 5192

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 347

100天精通Golang(基础入门篇)——第18天:深入解析Go语言中的结构体

在第18天的学习中,我们将深入探索Go语言中的结构体,这是Go语言中一个非常核心的概念。结构体为我们提供了一种封装多个不同类型数据的方法,是构建复杂数据类型的基础。Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。...一旦定义了结构体类型,它就能用于变量的声明初始化结构体// 1.按照顺序提供初始化值// 2.通过field:value的方式初始化,这样可以任意顺序。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

置顶必读(1) |《YOLOv8实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 14万+

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

AI人人懂 2271

golang获取结构体中的tag_26. Go 语言中结构体的 Tag 用法

大家好,我是明哥。由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。本文原文:http://golang.iswbm.comGithub:http://github.com/iswbm/GolangCodingTime1. 抛砖引玉:什么是 Tag?正常情况下,你定义的结构体是这样子的,每个字段都由名字和字段类型组成type ...

weixin_39678304的博客 835

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录

《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。

546

Go语言中的结构体类型

介绍Golang中结构体的定义、初始化、匿名字段、内嵌结构体以及方法的定义

阿星的博客 2027

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GO语言中的结构体struct

type t2 t1//运行结果如下:42 4142如果一个新类型是基于某个 Go 原生类型定义的,那么我们就叫 Go 原生类型为新类型的底层类型自定义类型:使用type定义一个新的类型,它与现有的类型没有直接关系,即使底层类型相同;这意味着自定义类型不能直接赋值给其他类型,也不能比较。类型别名:使用type定义一个类型别名,它与现有的类型是完全相同的,类型别名可以直接赋值给其底层类型,也可以直接比较。field1 T1说明T表示自定义结构体的名称,在同一包内不能包含重复的类型名。

敖光 SRE 1011

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Go语言中的结构体

Go语言结构体 struct里面可以包含多个字段(属性) struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以嵌套 struct中的所有字段在内存是连续的 结构体是用户单独定义的类型,不能和其他类型进行强制转换 struct没有构造函数,一般可以使用工厂模式来解决这个问题 工厂模式也就是定义一个全局函数,传入一些参数,返回一个结构体 结构体中字段可...

weixin_44879611的博客 1717

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

匿名结构体在Go语言中的应用

匿名结构体是Go语言中一个十分有用的特性,它可以快速地创建临时数据结构或者作为其他结构体的字段进行嵌套。本文介绍了匿名结构体的声明和初始化方式,并展示了相关应用场景的代码示例。希望读者能够在实际开发中充分利用匿名结构体的优势,提升代码的可读性和灵活性。本文将详细介绍匿名结构体在Go语言中的应用,并展示相关的代码示例。匿名结构体也可以作为其他结构体的字段,起到嵌套的作用。以上就是关于匿名结构体在Go语言中的应用的介绍。通过匿名结构体的嵌套,可以更方便地访问和操作相关的数据。匿名结构体在Go语言中的应用。

IELLQUI1的博客 373

认识GO语言中的nil,零值与空结构体

认识GO语言中的nil,零值与空结构体

weixin_46628206的博客 1770

简单易懂,解析Go语言中的struct结构体

实践出真知,用例子和底层代码,带你搞懂Go语言中的struct结构体

lonely__snow的博客 1493

[Go] go语言中的结构体标签

当在进行json的序列化时经常用到,结构体标签对于go本身来说就是注释 但是可以通过反射获取到标签的内容,所以很多包都可以有自己的作用 具体原理就是反射实现 package v2 type VisitorLoginForm struct { VisitorId string `form:"visitor_id" json:"visitor_id" uri:"visitor_id" x...

程序员老狼专注开发aigc或客服系统应用 420

Go语言结构体中的填充字段:揭秘内存对齐的奥秘

一、内存对齐与填充字段详解在 Go 语言中,结构体(struct)是一种用户自定义的数据类型,它允许我们把多个不同类型的数据组合在一起,组成一个单一的复合结构。无论是构建复杂的数据结构,还是实现面向对象编程中的概念,结构体在 Go 语言中都扮演着非常重要的角色!这段代码是我在 Github 上阅读到的,当时我对这个结构体类型的设计感到好奇,不禁思考这样设计的原因是什么?它有哪些优势?在搜索引擎的帮助下,我最终了解到这些字段被称为填充字段(Padding Fields)。

所幸你是例外的博客 1509

如何初始化结构体中的指针结构体_跟我一起学习go语言(五)golang中结构体的初始化方法...

1、自定义一个结构体type Vertex struct { X, Y float64}2、初始化方法-指针:rect1 := new(Vertex )rect2 := &Vertex {}rect3 := &Vertex {1, 2}rect4 := &Vertex {X:100, Y:200}注意: 这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new(...

weixin_39983051的博客 888

深入浅出:Go语言中的结构体(Struct)

在Go语言中,结构体是一种用户自定义的数据类型,它可以包含不同类型的字段。要定义一个结构体,需要使用type关键字加上结构体名称,然后用大括号包裹各个字段。每个字段由字段名和字段类型组成。通过本文的学习,你应该掌握了Go语言中结构体的核心概念及其用法,包括定义结构体、创建实例、访问字段、绑定方法等方面的知识。无论是构建简单的命令行工具还是复杂的Web服务,这些技能都将为你编写高效、优雅的代码奠定坚实的基础。

软件架构师笔记 1082

Go 语言中的结构体

我们刚刚学习了方法(Methods)和接口(Interfaces),而它们几乎总是与结构体(Structs)一起使用。可以说,,理解它至关重要。它扮演的角色非常像 PHP 中的class,但只负责,不直接包含方法。我们同样分场景,从简单到高阶来介绍它,并首先回答你最关心的问题。

上善若水 805

深入理解Go语言中的结构体【8】

深入理解Go语言中的结构体【8】

m0_52896752的博客 373

go语言中的结构体详解

在Go语言中,结构体是一种自定义的数据类型,用于将不同类型的字段组合在一起形成一个新的数据结构。结构体定义了一组字段,每个字段可以有不同的类型,这些字段一起构成了结构体的实例。通过结构体,我们可以将相关的数据进行组织和管理,从而更方便地进行操作和传递。结构体的定义使用关键字type和struct。

2302_79993788的博客 1628
上一篇: go语言中map
下一篇: jvm中的垃圾回收器
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值