Go基础(复杂类型):结构体

简介: 结构体一个结构体(struct)就是一个字段的集合。 (而 type 的含义跟其字面意思相符。) 下面来写一个简单的例子:package mainimport "fmt"/** * 一个结构体就是一...

结构体

一个结构体(struct)就是一个字段的集合。
(而 type 的含义跟其字面意思相符。)
下面来写一个简单的例子:

package main

import "fmt"

/**
 * 一个结构体就是一个字段的集合
 */
type Vertex struct {
    X int
    Y float64
}

func main() {
    fmt.Println(Vertex{1,2.31231})
}

输出结果:

{1 2.31231}

一、结构体字段

结构体字段使用点号来访问。

package main

import "fmt"

type Vertex2 struct {
    X int
    Y int
}

func main() {
    //在这里给结构体赋值,x=6,y=3
    v := Vertex2{6, 3}
    //这边输出的结果是6,3
    fmt.Println(v.X, v.Y)
    //这边从新给结构体中的X赋值,X=7
    v.X = 7
    //输出X=7
    fmt.Println(v.X)
}

二、结构体指针

结构体字段可以通过结构体指针来访问。
如果我们有一个指向结构体的指针 p,那么可以通过 (*p).X 来访问其字段 X。不过这么写太啰嗦了,所以语言也允许我们使用隐式间接引用,直接写 p.X 就可以。

package main

import "fmt"

type Vertex3 struct {
    X int
    Y int
}

func main() {
    //给结构体赋值,X=1,Y=3
    v := Vertex3{1, 3}
    //这个是输出实际的结构体的值,所以{1 3}
    fmt.Println(v)
    //将结构体给p做引用,p是一个指向结构体的指针
    p := &v
    //输出结果有引用的结果,有一个&,&{1 3}
    fmt.Println(p)
    //给结构体中的X赋值为1e9,这个表示1后面跟着9个0
    p.X = 1e9
    //输出结果{1000000000 3}
    fmt.Println(v)
}

输出结果:

{1 3}
&{1 3}
{1000000000 3}

三、结构体文法

结构体文法通过直接列出字段的值来新分配一个结构体。
使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。)
特殊的前缀 & 返回一个指向结构体的指针。

package main

import "fmt"

//定义一个结构体
type Vertex4 struct {
    //在结构体中定义两个变量
    X, Y int
}

var (
    //给X、Y都赋值
    v1 = Vertex4{1, 2}  // has type Vertex
    //给X赋值为1,Y未赋值,默认为0
    v2 = Vertex4{X: 1}  // Y:0 is implicit
    //X、Y都不赋值,默认都为0
    v3 = Vertex4{}      // X:0 and Y:0
    //指针的方式去赋值
    p  = &Vertex4{1, 2} // has type *Vertex
)

func main() {
    fmt.Println(v1, v2, v3, p)
}

好了,这一次的结构体文法就是这样子了。

目录
相关文章
|
4月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
257 3
|
12月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
271 15
|
8月前
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
306 2
|
9月前
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
9月前
|
JSON Go C语言
Go语言之定义结构体(Struct)-《Go语言实战指南》
Go 语言中的结构体(`struct`)是一种复合数据类型,可将多个不同类型的字段组合成一个类型。本文介绍了结构体的基本定义、实例创建方式、字段访问与修改、零值特性、比较规则、嵌套使用及标签功能。通过示例代码详细讲解了如何定义和操作结构体,以及其在 JSON 编码等场景的应用。
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
392 71
|
12月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
188 5
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
294 1
Go nil 空结构体 空接口有什么区别?
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
399 4