GO语言中数组和指针

数组

Go语言提供了数组类型的数据结构。

数组是同一数据类型元素的集合。这里的数据类型可以是整型、字符串等任意原始的数据类型。数组中不允许混合不同类型的元素。(当然,如果是interface{}类型数组,那么一个数组元素可以包含任意数据类型。)

数组的每一个元素都是类型相同、长度固定且已经编号的,所以数组元素可以通过索引来读取(或者修改)。索引从0开始,第一个元素的索引为0,第二个元素的索引为1,以此类推。

数组的声明

Go语言数组的声明需要指定元素类型以及元素的个数。数组是一定要声明这个size的。语法格式如下:

var array_name [Size] array_type

以上为一维 数组的定义方式。例如下面定义了数组a的长度为10类型为int

var a [10] int

数组的初始化

//声明并初始化
var a = [3]int{1,2,3}
//也可以通过 := 在声明数组时快速初始化数组
a := [3]int{1,2,3}

如果数组的长度不确定,你可以使用...来代替数组的长度,编译器会自动根据你的声明来推断数组的长度。但是要记住,使用...代替长度,必须在声明数组的同时初始化数组。例如

var a = [3]int{1,2,3}
//或者
a := [...]int{1,2,3}

如果数组已经声明过了,可以根据数组的索引给上述数组进行初始化。例如

var a [3]int //int array with length 3
a[0] = 12 // array index starts at 0
a[1] = 13
a[2] = 14

在你没有给数组赋值或者只给个别元素赋值时,数组中所有没有被赋值的元素都被自动赋值为数组类型的零值。**上述数组中,a是一个整型数组,所以a的每一个元素都赋值为0。

package main

import "fmt"

func array() {
var a [3]int //int array with length 3
a[0] = 12 // array index starts at 0 fmt.Println(a)
}

上述代码的输出结果为 [12 0 0]

额外说明一下,数组的大小是类型的一部分。因此[5]int[25]int 是不同类型。并且数组是不能调整大小的。

数组是值类型

Go语言中,数组是值类型而不是引用类型。这意味着将数组赋值给另一个新的变量时,该变量会得到一个原始数组的副本。如果对变量进行更改,是不会影响到原始数组。

package main

import "fmt"

func main() {
a := [...]string{"hello", "world"}
b := a
b[0] = "你好"
fmt.Println("a is ", a)
fmt.Println("b is ", b)
}

上述代码中对新数组b进行了修改,这个修改不会出现在数组a中。程序的输出结果为

a is  [hello world]
b is [你好 world]

数组的长度

通过将数组作为参数传递给len()函数,可以得到数组的长度。

package main

import "fmt"

func main() {
a := [...]int{5, 89, 21, 78}
fmt.Println("length of a is",len(a))
}

上述程序的输出为length of a is 4

数组的迭代

for循环

使用for循环可以用来遍历数组的元素。

package main
import "fmt"
func array() {
a := [...]int{5, 89, 21, 78}
for i := 0; i < len(a); i++ {
fmt.Printf("数组的第%d个元素为%d ", i, a[i])
}
}

上述代码通过for循环遍历数组的元素,从索引0到到len(a)-1(因为索引从0开始么)。

程序的输出结果为数组的第0个元素为5 数组的第1个元素为89 数组的第2个元素为21 数组的第3个元素为78

range迭代数组

Go语言中提供了一种更好、更简洁的写法,就是通过for循换的range来遍历数组。

range关键字用于for循环中迭代数组、切片、通道、或者集合。在数组和切片中,它返回元素的索引和对应的值,在集合中返回key-value对的ket值。

package main
import "fmt"
func array() { for i, v := range a {//range返回元素对应的索引和值
fmt.Printf("数组的第 %d 个元素为 %d ", i, v)
}
}

如果只希望得到元素的值并忽略索引,可以通过用 _ 空白标识符,替换原本用来接收索引值的变量,以此来忽略

for _, v := range a { // 忽略了索引
}

指针

指针指向内存中的特定区域并允许检索存储在其中的值。与C语言一样,可以使用运算符&获取某个变量在内存中的地址并使用运算符*根据地址取值。

指针的声明

一个指针变量指向了一个值的内存地址。与变量和常量类似,在使用指针前,需要声明指针。

//varName是指针变量的变量名,varType为指针类型,*号用于指定变量作为一个指针。
//*varType是指向varType类型值的指针变量类型。
var varName *varType

指针声明的示例

package main
import "fmt"
func main() {
b := 1
var a *int = &b
fmt.Printf("a的类型是%T\n",a)
fmt.Println("b的地址为",a)
}

输出结果

a的类型是*int
b的地址为 0xc000018030 Program exited.
Go中的空指针

指针的零值是nil,如果只声明而不初始化值,那么这个其值为零值即nil

使用new()函数创建指针

Go同时还提供了一个方便的函数new()来创建指针。new()函数将一个数据类型作为参数,并返回一个指向参数类型的指针变量。并且这个指针变量指向的值被赋为零值。

package main
import "fmt"
func main() {
//size 就是一个int型指针变量
size := new(int)
fmt.Printf("Size value is %d, type is %T, address is %v\n", *size, size, size)
*size = 85
fmt.Println("New size value is", *size)
}

解除消指针的引用

解除指针的引用就是说访问指针所指向的变量的值。例如a为指针变量,那么解除指针引用的语法为*a

我们也可以根据指针来修改变量。

package main
import "fmt"
func main() {
a := 1
b := &a
c := b
fmt.Println("a的地址为:",b)
fmt.Println("a的值为:",*b)
*c++
fmt.Println("a的值为:",a)
}

输出结果

a的地址为: 0xc000018030
a的值为: 1
a的值为: 2

在上述代码中,我们首先是定义了一个整型变量a,并将其地址赋值给指针变量b,同时通过ba的地址赋给c。最后通过输出结果可以看到,我们可以通过指针来修改变量的值。

注意:Go语言并不支持指针运算

Go语言基础四:数组和指针的更多相关文章

  1. 第二十四节:Java语言基础-讲解数组的综合应用

    数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...

  2. Java之--Java语言基础组成—数组

    Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...

  3. Go语言基础之数组

    Go语言基础之数组 本文主要介绍数组(array)及它的基本使用. Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化 ...

  4. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  5. GO学习-(8) Go语言基础之数组

    Go语言基础之数组 Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基本语法: // 定义一个长度为3元素类型为 ...

  6. R语言基础:数组&列表&向量&矩阵&因子&数据框

    R语言基础:数组和列表 数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, d ...

  7. C语言基础 (9) 数组指针

    复习 只要把地址拿到就能这么操作.. (这里是合法的地址,不是野指针) 只有定义变量后,此变量的地址才是合法的地址 野指针就是保存没有意义地址的指针变量 操作野指针变量本身不会有任何问题 操作野指针所 ...

  8. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  9. C语言学习004:数组与指针

    在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的

随机推荐

  1. python数据类型、用户交互和运算符

    基本数据类型 1.字典dict(dictionary) 能够准确的记录储存的信息 """ 大括号里面 放多个元素 之间用逗号隔开 元素为K:V键表示储存 K相对于V一般表 ...

  2. GB/T 25000.51-2016 系统与软件工程、系统与软件质量要求和评价 第51部分

    中科软测认证中心(软件测评) 1.支持GB/T 25000.51的质量特性 (1)产品质量模型及特性 功能性 功能完备性 功能正确性 功能适合性 功能性的依从性 性能效率 时间特性 资源利用率 容量 ...

  3. 客户案例-SES S.A.

    SES专门为世界上最偏远的地方提供高性能的移动网络连接.广播.维和人员的实时情报和媒体内容. SES是一个全球性组织,专注于提供高性能的视频和虚拟数据解决方案.今天,SES拥有最大的覆盖范围,有超过7 ...

  4. 网络协议之:sctp流控制传输协议

    目录 简介 TCP有什么不好 sctp的特点 总结 简介 要讲网络协议,肯定离不开OSI(Open System Interconnection)的七层模型. 我们一般关注的是网络层之上的几层,比如I ...

  5. 【多线程】线程礼让 Thread.yield()

    线程礼让 Thread.yield() 礼让线程,让当前正在执行的线程暂停,但不阻塞 : 将线程从运行状态转为就绪状态 : 让cpu重新调度,礼让不一定成功!看CPU心情. 代码示例: /** * @ ...

  6. ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景

    ClickHouse的由来 ClickHouse是什么数据库?ClickHouse速度有多快?应用场景是怎么样的?ClickHouse是关系型数据库吗?ClickHouse目前是很火爆的一款面向OLA ...

  7. Mac 睡眠唤醒 不睡眠 问题

    问题 之前一直有夜晚睡觉前电脑关机的习惯,主要是想着电脑也跟人一样️要休息.然后最近想着自己 Mac 干脆每天睡眠算了,省得每天开关机麻烦,所以就最近这段时间每次夜晚睡觉前主动去点了电脑的 「Slee ...

  8. HashMap 中的 hash 函数

    1. 什么是 hash 函数 hash 函数,即散列函数,或叫哈希函数.它可以将不定长的输入,通过散列算法转换成一个定长的输出,这个输出就是散列值.需要注意的是,不同的输入通过散列函数,也可能会得到同 ...

  9. python常用标准库(os系统模块、shutil文件操作模块)

    常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...

  10. 回流&重绘

    浏览器加载解析页面:把HTML解析为DOM树,解析CSS生成CSSOM树,HTML DOM树和CSSOM树组合构建render树,首次触发回流和重绘后将页面结构信息发送给GPU进行绘制渲染. 回流:当 ...