这是我参与「第五届青训营 」伴学笔记创作活动的第2天
指针与数组
与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。
指针变量其实就是用于存放某一个对象的内存地址。
指针声明和初始化
和基础类型数据相同,在使用指针变量之前我们首先需要申明指针,声明格式如下:var var_name var-type,其中的var-type 为指针类型,var_name 为指针变量名,*号用于指定变量是作为一个指针。
var a int= 20 /* 声明实际变量 */
var p *int /* 声明指针变量 */
p = &a /* 指针变量的存储地址 */
fmt.Println(a)
fmt.Println(*p)//a的值
fmt.Println(p)//a的地址
当一个指针被定义后没有分配到任何变量时,它的值为 nil,也称为空指针。它概念上和其它语言的null、NULL一样,都指代零值或空值。
数组
和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
声明与初始化数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
var balance [10] float32
//直接进行初始化:
var balance [5]float32(可省略) = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//通过字面量在声明数组的同时快速初始化数组:
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//数组长度不确定,编译器通过元素个数自行推断数组长度,在[ ]中填入...,举例如下:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//数组长度确定,指定下标进行部分初始化:
balanced := [5]float32(1:2.0, 3:7.0)
/*
注意:
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小。
*/
go中的数组名意义
在c语言中我们知道数组名在本质上是数组中第一个元素的地址,而在go语言中,数组名仅仅表示整个数组,是一个完整的值,一个数组变量即是表示整个数组。
所以在go中一个数组变量被赋值或者被传递的时候实际上就会复制整个数组。如果数组比较大的话,这种复制往往会占有很大的开销。所以为了避免这种开销,往往需要传递一个指向数组的指针,这个数组指针并不是数组。关于数组指针具体在指针的部分深入的了解。
数组指针
通过数组和指针的知识我们就可以定义一个数组指针,代码如下:
var a = [...]int{1, 2, 3} // a 是一个数组
var b = &a // b 是指向数组的指针
数组指针可以防止数组作为参数传递的时候浪费空间
结构体
声明结构体
在声明结构体之前我们首先需要定义一个结构体类型,这需要使用type和struct,type用于设定结构体的名称,struct用于定义一个新的数据类型。具体结构如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
使用
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
访问结构体成员
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。举例代码如下:
package main
import "fmt"
type Books struct {
title string
author string
}
func main() {
var book1 Books
book1.title = "Go 语言入门"
book1.author = "mars.hao"
结构体指针
关于结构体指针的定义和申明同样可以套用前文中讲到的指针的相关定义,从而使用一个指针变量存放一个结构体变量的地址。
/*
定义一个结构体变量的语法:var struct_pointer *Books。
这种指针变量的初始化和上文指针部分的初始化方式相同struct_pointer = &Book1,但是和c语言中有所不同,使用结构体指针访问结构体成员仍然使用.操作符。格式如下:struct_pointer.title
*/
var p *Books = &book1
fmt.Println(*p)
fmt.Println(p.author)
fmt.Println(p.title)