Go语言切片,范围,集合

简介: 1.Go 语言切片(Slice)概述Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。


1.Go 语言切片(Slice)


概述


Go 语言切片是对数组的抽象。


Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。


定义切片


你可以声明一个未指定大小的数组来定义切片:


var identifier []type
var si []int


或使用 make() 函数来创建切片:


var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)


也可以指定容量,其中 capacity 为可选参数


make([]T, length, capacity)


这里 len 是数组的长度并且也是切片的初始长度


切片初始化


s :=[] int {1,2,3 }


len() 和 cap() 函数


切片是可索引的,并且可以由 len() 方法获取长度。

切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。


package main
import "fmt"
func main() {
  var numbers = make([]int, 3, 5)
  fmt.Println(len(numbers), cap(numbers), numbers)  // 3 5 [0 0 0]


空(nil)切片

一个切片在未初始化之前默认为 nil,长度为 0,实例如下:


package main
import "fmt"
func main() {
  var numbers []int
  if numbers == nil {
    fmt.Println("切片为空")  // 切片为空
  }
}


切片截取


package main
import "fmt"
func main() {
  numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  fmt.Println(numbers)  // [0 1 2 3 4 5 6 7 8 9]
  fmt.Println(numbers[1:4])  // [1 2 3]     
  fmt.Println(numbers[:3])  // [0 1 2]   
  fmt.Println(numbers[4:])  // [4 5 6 7 8 9]
}


append() 和 copy() 函数


append()


package main
import "fmt"
func main() {
  numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  /* 向切片添加一个元素 */
  numbers = append(numbers, 521)
  /* 同时添加多个元素 */
  numbers = append(numbers, 11, 12, 13)
  fmt.Println(numbers)  // [0 1 2 3 4 5 6 7 8 9 521 11 12 13]
}


copy()


package main
import "fmt"
func main() {
  numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  /* 创建切片 numbers1 是之前切片的两倍容量*/
  numbers1 := make([]int, len(numbers), (cap(numbers))*2)
  copy(numbers1, numbers)
  fmt.Println(numbers1)  // [0 1 2 3 4 5 6 7 8 9]
}


2.Go 语言范围(Range)


Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

实例1:


package main
import "fmt"
func main() {
  // 使用range去求一个slice的和。使用数组跟这个很类似
  nums := []int{2, 3, 4}
  sum := 0
  for _, num := range nums {
    sum += num
  }
  fmt.Println(sum)  // 9
}


实例2:


package main
import "fmt"
func main() {
  // 使用range去求一个slice的和。使用数组跟这个很类似
  nums := []int{2, 3, 4}
  sum := 0
  for i, num := range nums {
    sum += num
    fmt.Println(i)
  }
  fmt.Println(sum)
}
----------------------------------
输出:
0
1
2
9


实例3:range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。


package main
import "fmt"
func main() {
  for i, c := range "hello" {
    fmt.Println(i, c)
  }
}
---------------------------------------
输出:
0 104
1 101
2 108
3 108
4 111


3.Go 语言Map(集合)


Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

实例1:


package main
import "fmt"
func main() {
  var country map[string]string
  country = make(map[string]string)
  /* map插入key - value对 */
  country["France"] = "巴黎"
  country["beijing"] = "北京"
  country["Japan"] = "日本"
  /* 使用键输出地图值 */
  for cou := range country {
    fmt.Println(cou, "+", country[cou])
  }
}
-------------------------------------------------
输出:
France + 巴黎
beijing + 北京
Japan + 日本  


实例2:


package main
import "fmt"
func main() {
  var country map[string]string
  country = make(map[string]string)
  /* map插入key - value对 */
  country["France"] = "巴黎"
  country["beijing"] = "北京"
  country["Japan"] = "日本"
  /* 查看元素在集合中是否存在 */
  capital, ok := country["American"]
  if ok {
    fmt.Println(capital)
  } else {
    fmt.Println("American的首都不存在")
  }
}
----------------------------------------
输出:
American的首都不存在


实例3:delete() 函数用于删除集合的元素


package main
import "fmt"
func main() {
  var country map[string]string
  country = make(map[string]string)
  /* map插入key - value对 */
  country["France"] = "巴黎"
  country["beijing"] = "北京"
  country["Japan"] = "日本"
  delete(country, "Japan")
  fmt.Println(country)
}
------------------------------------
输出:map[France:巴黎 beijing:北京]
目录
相关文章
|
9天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
38 10
|
7天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
9天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
31 10
|
9天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
6天前
|
存储 监控 数据可视化
Go 语言打造公司监控电脑的思路
在现代企业管理中,监控公司电脑系统对保障信息安全和提升工作效率至关重要。Go 语言凭借其高效性和简洁性,成为构建监控系统的理想选择。本文介绍了使用 Go 语言监控系统资源(如 CPU、内存)和网络活动的方法,并探讨了整合监控数据、设置告警机制及构建可视化界面的策略,以满足企业需求。
23 1
|
13天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
10天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
15天前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
23 6
|
15天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
18 3
|
17天前
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。