Go 语言数组(上)

简介: 引言  数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。  相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。数组元素可以通过索引(位置)来读取(或者修改),索引从0 开始,第一个元素索引为 0,第二个索引为1,以此类推。

引言


  数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。


  相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。

数组元素可以通过索引(位置)来读取(或者修改),索引从0 开始,第一个元素索引为 0,第二个索引为1,以此类推。



2387773-20220324210705786-1632530108.png

一、数组的定义


1. 语法


var variable_name [SIZE] variable_type 

variable_name:数组的名称

SIZE:数组长度,必须是常量

variable_type:数组保存元素的类型



2. 示例

package main
import "fmt"
func main() {
 var a [3]int    //定义一个int类型的数组a,长度是3
 var b [2]string //定义一个字符串类型的数组b,长度是2
 fmt.Printf("a: %T\n", a) //使用%T来输出类型
 fmt.Printf("b: %T\n", b)
 fmt.Printf("a: %v\n", a)
 fmt.Printf("b: %v\n", b)
}
//输出结果如下,可以看到没初始化的值,int是0,而字符串则是空的字符串
a: [3]int
b: [2]string
a: [0 0 0]
b: [ ]

 

从上面运行的结果中可以看出来,数组和长度和元素类型共同组成了数组的类型

 

二、数组的初始化


初始化,就是给数组的元素赋值,没有初始化的数组,默认元素值都是零值,布尔类型是false,字符串是空字符串


1. 未初始化的数组


package main
import "fmt"
func main() {
 var a [2]bool
 var b [2]int
 var c [3]string
 var d [3]float32
 fmt.Printf("a: %v\n", a)
 fmt.Printf("b: %v\n", b)
 fmt.Printf("c: %v\n", c)
 fmt.Printf("d: %v\n", d)
}
//输出结果如下
a: [false false]
b: [0 0]
c: [  ]
d: [0 0 0]


2. 使用初始化列表


package main
import "fmt"
func main() {
 var a = [3]int{1, 2, 3}
 var b = [2]string{"hello world"}
 var c = [2]bool{true, false}
 a1 := [2]int{1, 2} //类型推断
 fmt.Printf("a: %v\n", a)
 fmt.Printf("b: %v\n", b)
 fmt.Printf("c: %v\n", c)
 fmt.Printf("a1: %v\n", a1)
}
//输出结果如下
a: [1 2 3]
b: [hello world ]
c: [true false]
a1: [1 2]

 

使用初始化列表,就是将值写在大括号里面

 

 

3. 省略数组长度


如果数组长度不确定,可以使用 ...代替数组的长度,编译器会根据元素个数自行推断数组的长度

package main
import "fmt"
func main() {
 var a = [...]int{1, 2, 3, 4, 5}
 var b = [...]string{"hello", "world", "hello", "go"}
 var c = [...]bool{true, false}
 a1 := [...]int{1, 2} //类型推断
 fmt.Printf("a: %v\n", a)
 fmt.Printf("b: %v\n", b)
 fmt.Printf("c: %v\n", c)
 fmt.Printf("a1: %v\n", a1)
}
//输出结果如下
a: [1 2 3 4 5]
b: [hello world hello go]
c: [true false]
a1: [1 2]


4. 指定索引值的方式来初始化


可以通过指定所有方式来初始化,未指定的所有默认值为零值

package main
import "fmt"
func main() {
 var a = [...]int{0: 1, 2: 2}
 var b = [...]string{1: "hello", 2: "go"}
 var c = [...]bool{2: true, 5: false}
 a1 := [...]int{1, 2} //类型推断
 fmt.Printf("a: %v\n", a)
 fmt.Printf("b: %v\n", b)
 fmt.Printf("c: %v\n", c)
 fmt.Printf("a1: %v\n", a1)
}
//输出结果如下
a: [1 0 2]
b: [ hello go]
c: [false false true false false false]
a1: [1 2]

总结


初始化数组中{}中的元素个数不能大于[]中的数字。

如果忽略[]中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小


5. 访问数组元素


数组元素可以通过索引(位置)来读取。

格式为数组名后加中括号,中括号中为索引的值。数组的最大下标为数组长度-1,大于这个下标会发生数组越界。

示例

package main
import "fmt"
func main() {
 var a [2]int
 a[0] = 100
 a[1] = 200
 fmt.Printf("a[0]: %v\n", a[0])
 fmt.Printf("a[1]: %v\n", a[1])
 //对数组进行修改
 a[0] = 1
 a[1] = 2
 fmt.Println("---------修改后--------")
 fmt.Printf("a[0]: %v\n", a[0])
 fmt.Printf("a[1]: %v\n", a[1])
}
//输出结果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2


6. 根据数组长度遍历数组


可以根据数组长度,通过for循环的方式来遍历数组,数组的长度可以使用len函数获得


使用len()函数获取数组的长度


package main
import "fmt"
func main() {
 var a1 = [3]int{1, 2, 3}
 fmt.Printf("len(a1): %v\n", len(a1))
 var a2 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
 fmt.Printf("len(a2): %v\n", len(a2))
}
//输出结果如下
len(a1): 3
len(a2): 9


数组遍历,根据长度和下标


package main
import "fmt"
func main() {
 a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
 for i := 0; i < len(a); i++ {
  fmt.Printf("a[%d]:%v\n", i, a[i])
 }
}
//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9


使用for range


package main
import "fmt"
func main() {
 var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
 for i, v := range a {    //i也可以使用空白标识符代替,不接受索引的值
  fmt.Printf("a[%v]:%v\n", i, v)
 }
}
//输出结果如下
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
a[5]:6
a[6]:7
a[7]:8
a[8]:9

总结


  • 数组的元素可以通过下标的方式来访问,下标的最大长度为数组长度-1,如果大于这个下标则会越界
  • 遍历数组的两种方法:
    ① 通过 for循环,长度可以使用len()获取
    ② 通过for range循环遍历数组,返回数组下标和对应的值;若不想要下标,可以使用空白标识符_来取代

 


三. 访问数组元素


1. 访问数组元素


  • 数组元素可以通过索引(位置)来读取。
  • 格式为数组名后加中括号,中括号中为索引的值。数组的最大下标为数组长度-1,大于这个下标会发生数组越界。

示例 ①

package main
import "fmt"
func main() {
 var a [2]int
 a[0] = 100
 a[1] = 200
 fmt.Printf("a[0]: %v\n", a[0])
 fmt.Printf("a[1]: %v\n", a[1])
 //对数组进行修改
 a[0] = 1
 a[1] = 2
 fmt.Println("---------修改后--------")
 fmt.Printf("a[0]: %v\n", a[0])
 fmt.Printf("a[1]: %v\n", a[1])
}
//输出结果如下
a[0]: 100
a[1]: 200
---------修改后--------
a[0]: 1
a[1]: 2

2387773-20220328125214415-313362656.png


示例 ②
package main
import "fmt"
func main() {
  //声明数组的同时快速初始化数组
  balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  //输出数组元素
  for i := 0; i < 5; i++ {
    fmt.Printf("balance[i]: %f\n", balance[i])
  }
  //输出每个数组元素的值
  balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  for x := 0; x < 5; x++ {
    fmt.Printf("balance2[x]: %f\n", balance2[x])
  }
  //将索引为1和3的元素初始化
  balance3 := [5]float32{1: 2.0, 3: 7.0}
  for y := 0; y < 5; y++ {
    fmt.Printf("balance3: %f\n", balance3[y])
  }
}
//输出结果如下
balance[i]: 1000.000000
balance[i]: 2.000000
balance[i]: 3.400000
balance[i]: 7.000000
balance[i]: 50.000000
balance2[x]: 1000.000000
balance2[x]: 2.000000
balance2[x]: 3.400000
balance2[x]: 7.000000
balance2[x]: 50.000000
balance3: 0.000000
balance3: 2.000000
balance3: 0.000000
balance3: 7.000000
balance3: 0.000000
  



相关文章
|
1天前
|
安全 Go 调度
Go语言中的并发编程
Go语言自带了强大的并发编程能力,它的协程机制可以让程序轻松地实现高并发。本文将从并发编程的基础概念出发,介绍Go语言中的协程机制、通道和锁等相关知识点,帮助读者更好地理解并发编程在Go语言中的实践应用。
|
3天前
|
Ubuntu Unix Linux
【GO基础】1. Go语言环境搭建
【GO基础】1. Go语言环境搭建
|
4天前
|
JSON 前端开发 Go
lucky - go 语言实现的快速开发平台
go 语言实现的快速开发平台,自动生成crud代码,前端页面通过json配置,无需编写前端代码。
10 0
|
5天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
14 2
|
5天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
算法 Go 分布式数据库
构建高可用的分布式数据库集群:使用Go语言与Raft共识算法
随着数据量的爆炸式增长,单一数据库服务器已难以满足高可用性和可扩展性的需求。在本文中,我们将探讨如何使用Go语言结合Raft共识算法来构建一个高可用的分布式数据库集群。我们不仅会介绍Raft算法的基本原理,还会详细阐述如何利用Go语言的并发特性和网络编程能力来实现这一目标。此外,我们还将分析构建过程中可能遇到的挑战和解决方案,为读者提供一个完整的实践指南。
|
5天前
|
消息中间件 Go API
基于Go语言的微服务架构实践
随着云计算和容器化技术的兴起,微服务架构成为了现代软件开发的主流趋势。Go语言,以其高效的性能、简洁的语法和强大的并发处理能力,成为了构建微服务应用的理想选择。本文将探讨基于Go语言的微服务架构实践,包括微服务的设计原则、服务间的通信机制、以及Go语言在微服务架构中的优势和应用案例。
|
5天前
|
安全 测试技术 数据库连接
使用Go语言进行并发编程
【5月更文挑战第15天】Go语言以其简洁语法和强大的并发原语(goroutines、channels)成为并发编程的理想选择。Goroutines是轻量级线程,由Go运行时管理。Channels作为goroutine间的通信机制,确保安全的数据交换。在编写并发程序时,应遵循如通过通信共享内存、使用`sync`包同步、避免全局变量等最佳实践。理解并发与并行的区别,有效管理goroutine生命周期,并编写测试用例以确保代码的正确性,都是成功进行Go语言并发编程的关键。
|
5天前
|
数据采集 监控 Java
Go语言并发编程:Goroutines和Channels的详细指南
Go语言并发编程:Goroutines和Channels的详细指南
12 3
|
5天前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解