【前进】基本语法⑤(关联数组·范围)

简而言之

我根据《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语言

广告
将在 10 秒后关闭
bannerAds