前言
本文来熟悉GO语言的指针和结构体。
本文大纲
1、指针
指针的概念
指针是存储一个变量的内存地址的变量。
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。
上图中:变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。
声明指针
声明指针,*T是指针变量的类型,它指向T类型的值。
var var_name *var-type
var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
示例代码:
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
获取变量的地址
Go 语言的取地址符是 &
例如:
var a int = 10
fmt.Printf("变量的地址: %x\n", &a )
运行结果:
变量的地址: 20818a220
获取指针的值
获取一个指针意味着访问指针指向的变量的值。语法是:*a
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is", *a)
指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
写法 var ptr **int;
示例如下:
var a int
var ptr *int
var pptr **int
a = 3000
/* 指针 ptr 地址 */
ptr = &a
/* 指向指针 ptr 地址 */
pptr = &ptr
/* 获取 pptr 的值 */
fmt.Printf("变量 a = %d\n", a )
fmt.Printf("指针变量 *ptr = %d\n", *ptr )
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
运行结果:
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
2、结构体
GO语言的结构体
Go 语言中数组可以存储同一类型的数据,但在结构体中不同项可以为不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
定义结构体及初始化
//定义结构体
type struct_variable_type struct {
member definition;
member definition;
...
member definition;
}
//声明结构体变量
variable_name := structure_variable_type {value1, value2...valuen}
示例:
// 1.按照顺序提供初始化值
P := person{"Tom", 25}
// 2.通过field:value的方式初始化,这样可以任意顺序
P := person{age:24, name:"Tom"}
// 3.new方式,未设置初始值的,会赋予类型的默认初始值
p := new(person)
p.age=24
结构体指针
指针指向一个结构体 也可以创建指向结构的指针。
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前
struct_pointer = &Book1;
使用结构体指针访问结构体成员,使用 "." 操作符
struct_pointer.title;
在掘金(juejin.cn) 一起分享知识,Keep Learning!
本文正在参加技术专题18期-聊聊Go语言框架