【前进】基本语法⑤(关联数组·范围)
简而言之
我根据《A Tour of Go》的顺序总结了我个人在学习Go的基础知识时的经验。
本次学习重点放在了Maps(映射)和Range(范围)上。
地图或地理位置相关的图表或排列。
Maps(连想数组)是一种使用键(key)来指定元素的数据结构,与数组通过整数值来指定元素不同。在Ruby中称为Hash,在Python中称为dictionary。
连想配列(Maps)的声明方式是怎样的?
連想配列(Maps)主要是按以下方式声明的。
①組み込み関数make()を利用して宣言
②初期値を指定して宣言
①使用内置函数make()进行声明
make()函数是一个内置函数,它返回一个已初始化并可以使用的指定类型的 map。
在使用make()函数时,我们可以按以下方式对 map 进行初始化。
make(map[キーの型]値の型, キャパシティの初期値)
make(map[キーの型]値の型)// キャパシティの初期値は、省略も可能
可以使用嵌入函数make()创建的Maps(关联数组)将键(key)和值(value)放入如下所示。
map[keyの値] = valueの値
您可以按照以下方式创建Maps(关联数组)。
func main() {
mapEx := make(map[string]string, 2) //マップの宣言
fmt.Println(mapEx) //=> map[] //宣言された空のマップ
mapEx["firstName"] = "Mike" //マップにkeyとvalueを挿入する。
mapEx["lastName"] = "Smith"
fmt.Println(mapEx) //=> map[lastName:Smith firstName:Mike]
}
设定初始值并声明。
即使不使用内置函数make(),也可以通过指定初始值来声明并创建Maps(关联数组),如下所示。
var 変数名 map[key]value = map[key]value{key1: value1, key2: value2, ..., keyN: valueN}
实际上,您可以按照以下方式创建Maps(关联数组)。
var mapEx = map[string]string{"firstName":"John", "lastName": "Smith"}
func main() {
fmt.Println(mapEx) //=> map[lastName:Smith firstName:Mike]
}
连想数组(Maps)的零值
如果没有指定映射(关联数组)的初始值,变量会被初始化为nil(空映射)。
空映射无法存储元素,如果要存储元素,则需要进行映射的初始化。
map [キーの型] 値の型
// map の後ろの [ ] にキーの型を、その後ろに値の型を指定します。
var map1 map[string]int
func main() {
fmt.Println(map1) //=> map[] //nilマップ
}
向Maps(映射表)中插入或更新元素
您可以按照以下方式向映射(Map)插入或更新元素。
map[key] = elem
我将验证能够通过上述方法进行插入和更新操作。
func main() {
mapEx := make(map[string]int)
mapEx["ele1"] = 1 //要素の挿入
fmt.Println(mapEx)
mapEx["newEle"] = 2 //要素の更新
fmt.Println(mapEx)
}
從映射(Maps)中獲取元素
可以通过Maps(关联数组)来获取元素,方式如下。
map[key]
我们将通过实际操作来确认使用上述方法可以获取元素。
func main() {
mapEx := map[string]string{"firstName":"John", "lastName": "Smith"}
fmt.Println(mapEx["firstName"]) //=> John
fmt.Println(mapEx["lastName"]) //=> Smith
}
删除Maps(映射)的元素
您可以按照以下方式删除映射(关联数组)的元素。
delete(mapEx, key)
我们将通过上述方法实际确认可以删除元素。
func main() {
mapEx := map[string]string{"firstName":"John", "lastName": "Smith"}
delete(mapEx, "firstName") //mapExの"firstName"を削除
fmt.Println(mapEx["firstName"]) //=>
fmt.Println(mapEx["lastName"]) //=> Smith
}
范围 (用于 的范围 節)
range函数用于对切片(Slices)和映射(Maps)进行逐个迭代处理。
Slice的范围
如果在range中循环切片,range将在每次反复中返回两个变量。
第一个变量是索引(index),第二个变量是索引位置的元素(value)。
var slice = []string{"Golang", "Ruby", "Javascript", "Python"}
func main() {
for index, value := range slice {
fmt.Println(index, value)
//=> 0 Golang
//=> 1 Ruby
//=> 2 Javascript
//=> 3 Python
}
}
在地图情况下的范围
如果在 range 中重复地使用地图,那么重复的顺序将会是随机的,但除此之外与切片相同。每次迭代都会返回两个变量,第一个变量是键(key),第二个变量是键位置的元素(value)。
var mapping = map[string]int{
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
}
func main() {
for key, value := range mapping {
fmt.Println(key, value)
//=> four 4
//=> five 5
//=> one 1
//=> two 2
//=> three 3
}
}
オンラインで動作をみる @ Go Playground
索引(index)和值(value)的省略
如果只需要索引,则可以省略索引和值,如下所示。
var slice = []string{"Golang", "Ruby", "Javascript", "Python"}
func main() {
for index, _ := range slice {
fmt.Println(index)
//=> 0
//=> 1
//=> 2
//=> 3
}
}
如果只需要价值,可以按照以下方式进行。
var slice = []string{"Golang", "Ruby", "Javascript", "Python"}
func main() {
for _, value := range slice {
fmt.Println(value)
//=> Golang
//=> Ruby
//=> Javascript
//=> Python
}
}
在中途停止或跳过循环处理。
如果要在循环中间停止,请使用break;如果要跳过其余处理并继续下一轮循环,请使用continue。
var slice = []string{"Golang", "Ruby", "Javascript", "Python"}
func main() {
for _, value := range slice {
if "Golang" == value {
fmt.Println("Golang found")
continue // 次の処理にスキップ
}
if "Javascript" == value {
fmt.Println("Javascript found!")
break // ループから抜ける
}
fmt.Println(value, "is not Golang")
}
}
// Golang found
// Ruby is not Golang
// Javascript found!
// -->Python には辿り付かない
只需要一个选择,把以下内容用中文进行本地化改写:
参考 + (original content)
我的Go之旅⑤
轻松愉快的Go编程(使用range语句)
第一次接触Go语言