厚土Go学习笔记 | 17. 结构体及用指针访问结构体
时间:2022-05-06
本文章向大家介绍厚土Go学习笔记 | 17. 结构体及用指针访问结构体,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
结构体是个很有用的东西,在用计算机语言描述现实世界里的东西时,不得不大量的使用它。把现实世界的某一样东西的各种属性,用一个一个的变量记录下来。
最简单的比如:平面坐标 平面坐标有两个值,X和Y
在go语言中可以这样定义一个坐标的结构体
type Coodinate struct{
X int
Y int
}
由于定义一个结构体是为了各种地方都能够调用,甚至外部调用。所以,无论是结构体的命名,还是结构体结构内部的组成元素都是首字母大写。(go语言一个简单的规则,大写首字母可供外部调用,小写首字母只在一定范围内调用。)
下面简单打印一下这个坐标结构体吧。
package main
import (
"fmt"
)
type Coodinate struct{
X int
Y int
}
func main() {
fmt.Println(Coodinate{5, 10})
}
打印的结果也与一般的输出不同,结构体的输出是带有 { }
符号的。
{5 10}
结构提里的组成元素,称之为“字段”
,可以使用符号 “.”
来访问。
Co := Coodinate{15, 20}
Co.X = 1973
上面的代码,初始化了一个结构体,又修改了其中X的值。
把刚才完整代码改一下
package main
import (
"fmt"
)
type Coodinate struct{
X int
Y int
}
func main() {
fmt.Println(Coodinate{5, 10})
Co := Coodinate{15, 20} //声明一个变量Co为结构体类型,并初始化。
fmt.Println(Co)
Co.X = 1973 //修改变量结构体的字段X值
fmt.Println(Co)
}
运行结果是这样的
{5 10}
{15 20}
{1973 20}
可以看到,在代码中,既能够直接使用结构体,又可以声明一个变量为结构体。然后对变量进行操作,例如修改变量结构体里的某个字段。
还记得指针吗?指针重点你要知道是利用内存地址来操作数据。变量是结构体类型,一样有内存地址。取地址方法是变量前加 &
符号
&Co
下面看看用指针如何修改一个变量结构体的。
package main
import (
"fmt"
)
type Coodinate struct{
X int
Y int
}
func main() {
fmt.Println(Coodinate{5, 10})
Co := Coodinate{15, 20} //声明一个变量Co为结构体类型,并初始化。
fmt.Println(Co)
Co.X = 1973 //修改变量结构体的字段X值
fmt.Println(Co)
//下面用指针访问结构体
p := &Co
p.X = 1975
p.Y = 45
fmt.Println("Pointer control result is", Co)
}
运行结果是这样的
{5 10}
{15 20}
{1973 20}
Pointer control result is {1975 45}
通过指针间接的访问是透明的。
结构体初始化的时候,不是必须给结构体内所有的字段都做初始化的。没有初始化的字段,会根据字段类型取它自己的零值(默认值)。方法如下
package main
import (
"fmt"
)
type Coodinate struct{
X int
Y int
}
var(
Co1 = Coodinate{73, 45}
Co2 = Coodinate{X:75}
Co3 = Coodinate{}
p = &Coodinate{9, 17}
)
func main() {
//结构体的初始化赋值
fmt.Println(Co1, Co2, Co3, p, *p)
}
运行结果是这样的
{73 45} {75 0} {0 0} &{9 17} {9 17}
注意看 p
和 *p
的不同结果。p 返回的结果有一个特殊的前缀 &
,是指向结构体的指针。 打印指针需要在变量前加 *
符号。所以是 *p
。
- C#实现软件开机自启动原理与代码
- Python读取SQLite文件数据
- 现代Web开发需要学习的15大技术
- 《剑指Offer》附加题_用两个队列实现一个栈_C++版
- MFC中的CListCtrl的最左边一列必须左对齐吗?
- 查找数组中重复的数字
- Lua学习笔记
- 使用Jpeglib
- 赋值运算符函数__from <剑指Offer>
- 从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用
- php实现SESSION跨域
- 使用cJSON解析JSON字符串
- 逻辑回归 | TensorFlow深度学习笔记
- MakeSureDirectoryPathExists与CreateDirectory的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法