range map

range
 
 
package main

import (
	"fmt"
)

func main() {
	var str1 string = "oldboy"
	for k1, v1 := range str1 {
		fmt.Println(k1, string(v1))
	}

	//for range 包含中文的字符串,英文字符 key 值按照+1顺序递增,中文字符 key 值按照+3顺序递增
	var str2 string = "老男孩IT教育,只培养技术精英。"
	for k2, v2 := range str2 {
		fmt.Println(k2, string(v2))
	}

	//for range 数组程序会复制对象,key、value 都是从复制品中取出,想要修改值循环数组的地址
	arr := [5]int{1, 2, 3, 4, 5}
	for k, v := range arr {
		if k == 0 {
			arr[0], arr[1] = 1000, 1000
			fmt.Println("修改原数组:", arr)  //[1000 1000 3 4 5]
		}

		// 使用复制品中取出的 value 修改原数组
		arr[k] = v + 100   // [101 102 103 104 105]
	}
	fmt.Println(arr)

	//多维数组遍历
	var arr2 [2][3]int = [2][3]int{{1, 2, 3}, {2, 4, 6}}

	for k1, v1 := range arr2 {
		for k2, v2 := range v1 {
			fmt.Printf("%d*%d=%d ", k1+1, k2+1, v2)
		}
		fmt.Printf("
")
	}

	//数组遍历值拷贝行为会造成性能问题,建议数组遍历使用引用类型slice,或数组指针
	arr3 := [5]int{1, 2, 3, 4, 5}
	arrP := &arr3
	for k, _ := range arrP {
		if k == 0 {
			arrP[0], arrP[1] = 1000, 1000
			fmt.Println("修改原数组:", arr3)
		}

		arrP[k] += 100
	}
	fmt.Println(arr3)

	//将所需数据 copy 到较小的 slice,以便释放底层数组内存
	arr4 := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	slice := arr4[:]
	for key, value := range slice {
		fmt.Printf("key: %v , value : %v
", key, value)
	}

	//map 遍历不能保证迭代返回次序,通常是随机结果,具体和版本实现有关
	m := map[int]string{
		1: "oldboy",
		2: "Linux",
		3: "Golang",
		4: "Python",
		5: "Java",
		6: "DBA",
	}
	for k, v := range m {
		fmt.Printf("%d => %s 
", k, v)
	}

	//channel 遍历
	var ch chan int
	ch = make(chan int, 10)

	for i := 0; i < 10; i++ {
		ch <- i
	}

	close(ch)
	for v := range ch {
		fmt.Println(v)
	}
	//如果没有 close() 因为存入管道10个数字,然后无限取数据,在取出来第10个数据,再次range管道,会dead lock
}

  

map 集合

package main

import "fmt"

//可以使用内建函数 make 也可以使用 map 关键字来定义 Map
/* 声明变量,默认 map 是 nil
var map_variable map[key_data_type]value_data_type
使用 make 函数
map_variable := make(map[key_data_type]value_data_type)
*/
func main() {
	var m = map[int]string{  //初始化集合,我喜欢的方式
		1: "oldboy",
		2: "Linux",
		3: "Golang",
	}
	/*
	var m=map[int]string
	m = make(map[int]string)  这是正规的初始化方法
	*/
	m[4]="java"  //新增键值对
	delete(m,1)  //删除键值对
	for k,v :=range m{
		fmt.Println(k,v)
	}
	//m := map[int]string{  //快速定义集合
	//	1: "oldboy",
	//	2: "Linux",
	//	3: "Golang",
	//}
}

  

原文地址:https://www.cnblogs.com/perfey/p/9904267.html