GO语言-指针与结构体【GO学习之路】

180 阅读3分钟

01.png

前言

本文来熟悉GO语言的指针和结构体。

本文大纲

GO语言更文第6篇.png

1、指针

指针的概念

指针是存储一个变量的内存地址的变量。

一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。

pointer1.png

上图中:变量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语言框架