首页 > 其他分享 >Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战

Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战

时间:2023-10-20 10:03:32浏览次数:35  
标签:Map Set map int len Logf m1 func GO


Map声明、元素访问及遍历 - GO语言从入门到实战

Map 声明的方式
m := map[string]int{"one": 1, "two": 2, "three": 3}  	
//m初始化时就已经设置了3个键值对,所以它的初始长度len(m)是3。

m1 := map[string]int{}  
//m1被初始化为一个空的map,然后通过m1["one"] = 1添加了一个键值对,所以它的初始长度len(m1)是1。

m2 := make(map[string]int, 10)
//使用make函数创建了一个具有初始容量10的map。这里的初始容量(capacity)并不是map的长度(len),但它决定了map可以在不重新分配内存的情况下存储的键值对的最大数量。也就是说,虽然指定了初始容量为10,但map的实际长度(即存储的键值对的数量)可以为0,并可以随着你添加键值对而增加,直到达到容量限制。欢迎关注云尔Websites 博客
//len(m2)将返回0(因为你还没有向m2中添加任何键值对)。

这块知识一定要多敲代码,运行看看,才能加深理解。
代码示例:

package my_map  
  
import "testing"  
  
func TestInitMap(t *testing.T) {  
	 m1 := map[int]int{1: 2, 2: 3, 3: 4}  
	 if v, ok := m1[2]; ok {  
	 	t.Logf("m1[2] = %d", v)  
	 } else {  
	 	t.Error("Key 2 does not exist in m1")  
	 }  
	 t.Logf("len m1 = %d", len(m1))  
	  
	 m2 := map[int]int{}  
	 m2[4] = 16  
	 t.Logf("len m2 = %d", len(m2))  
	  
	 m3 := make(map[int]int, 10)  
	 t.Logf("len m3 = %d", len(m3))  
}
Map 元素的访问

与其他主要编程语⾔的差异
在访问的 Key 不存在时,仍会返回零值,不能通过返回 nil 来判断元素是否存在。
缺点: 可能会使代码变得更复杂,因为我们必须显式地检查键是否存在。

func TestAccessNotExistingKey(t *testing.T) {  

	m := map[string]int{}
	if v, k := m["four"]; k {
 		t.Logf("m[1] = %d", v)  
	} else {
		t.Log("欢迎关注云尔Websites 博客")  
	}

	 m1 := map[int]int{}  
	  
	 if v, k := m1[1]; k {  
	 	t.Logf("m1[1] = %d", v)  
	 } else {  
	 	t.Log("Key 1 does not exist in m1")  
	 }  
	  
	 m1[2] = 0  
	 if v, k := m1[2]; k {  
	 	t.Logf("m1[2] = %d", v)  
	 } else {  
	 	t.Error("Key 2 does not exist in m1")  
	 }  
	  
	 m1[3] = 0  
	 if v, k := m1[3]; k {  
	 	t.Logf("Key 3's value is %d", v)  
	 } else {  
	 	t.Log("Key 3 does not exist in m1")  
	 }  
}
Map 遍历

遍历在之前文章里面说过,这里简单说下:
可以使用range关键字来遍历map。range会返回两个值:键和值。请注意,遍历map的顺序是不确定的,因为map是无序的数据结构。欢迎关注云尔Websites 

package main  
  
import "fmt"  
  
func main() {  
	 m := map[string]int{"one": 1, "two": 2, "three": 3}
	 // 使用range遍历map  
	 for key, value := range m {  
	 	fmt.Printf("Key: %s, Value: %d\n", key, value)  
	 }  
}

Map 扩展知识

Map 与⼯⼚模式

Map 的 value 可以是任何类型,包括方法。
与 Go 的 Dock type 接⼝⽅式⼀起,可以⽅便的实现单⼀⽅法对象的⼯⼚模式,可以将一个方法的名称(或其他唯一标识符)映射到一个具体的方法实现上。
代码示例:

package main  
  
import "fmt"  
  
type Calculator interface {  
 	Calculate(int, int) int  
}  
  
type Adder struct{}  
  
func (a Adder) Calculate(x, y int) int {  
 	return x + y  
}  
  
type Subtracter struct{}  
  
func (s Subtracter) Calculate(x, y int) int {  
 	return x - y  
}  
  
type Multiplier struct{}  
  
func (m Multiplier) Calculate(x, y int) int {  
 	return x * y  
}  
  
func main() {  
	 calculators := map[string]Calculator{  
	 "add":     Adder{},  
	 "subtract": Subtracter{},  
	 "multiply": Multiplier{},  
 }  
  
 for operation, calculator := range calculators {  
	 result := calculator.Calculate(5, 3)  
	 fmt.Printf("%s 5 and 3 gives: %d\n", operation, result)  
 }  
}

//在上面的示例中,定义了一个Calculator接口,它包含一个Calculate方法。然后创建了三个结构体(Adder、Subtracter和Multiplier),并为它们分别实现了Calculate方法。接下来创建了一个Map,将字符串映射到实现了Calculator接口的对象。最后使用for循环遍历Map,并根据操作类型执行相应的计算。
通过Map实现 Set

Go 的内置集合中没有 Set 实现, 可以 map[type]bool来写。

  1. 元素的唯⼀性,由于map的键必须是唯一的,所以使用map[type]bool可以确保Set中的元素也是唯一的;
  2. 基本操作:添加元素、判断元素是否存在、删除元素、获取元素个数。
//添加元素:
//创建了一个新的map(如果s尚未创建),并将element添加到Set中。
s := make(map[T]bool)  
s[element] = true

//判断元素是否存在:
//检查element是否存在于Set中。如果存在,exists将为true;否则为false。
_, exists := s[element]

//删除元素:
//从Set中删除element。
delete(s, element)

//元素个数:
//返回Set中的元素个数。
len(s)

通过Map实现 Set 的代码示例:

package map_ext

import "testing"

// TestMapWithFunValue 测试使用函数作为值的map
func TestMapWithFunValue(t *testing.T) {
	 m := make(map[int]func(op int) int)
	 m[1] = func(op int) int { return op }
	 m[2] = func(op int) int { return op * op }
	 m[3] = func(op int) int { return op * op * op }
	
	 result1 := m[1](2)
	 result2 := m[2](2)
	 result3 := m[3](2)
	
	 t.Logf("%d, %d, %d", result1, result2, result3)
}

// TestMapForSet 测试使用map实现集合功能
func TestMapForSet(t *testing.T) {
	 mySet := make(map[int]bool)
	 mySet[1] = true
	
	 n := 3
	 if mySet[n] {
	 	t.Logf("%d已存在", n)
	 } else {
	 	t.Logf("%d不存在", n)
	 }
	
	 mySet[3] = true
	 t.Logf("集合长度:%d", len(mySet))
	
	 delete(mySet, 1)
	 n = 1
	 if mySet[n] {
	 	t.Logf("%d已存在", n)
	 } else {
	 	t.Logf("%d不存在", n)
	 }
}

这里是一些需要注意的点:
1. 使用`make`函数初始化map,以明确其类型。
2. 为函数值定义了一个map,并存储了几个不同的函数。
3. 使用`delete`函数从map中删除一个键值对。

Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战_golang

学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。


标签:Map,Set,map,int,len,Logf,m1,func,GO
From: https://blog.51cto.com/u_3135183/7946910

相关文章

  • go 格式化json
    packagemainimport("bytes""encoding/json""fmt")funcmain(){//原始JSON字符串varjsonStr=[]byte(`{"Name":"Gopher","Title":"Programmer","Contact":......
  • 让AutoMapper使用变得简单
     倘若在项目中真正要用的时候,我觉得还是应该对AutoMapper的方法进行一些整理,最好能够封装一下,这里我通过扩展方法的形式将其封装为AutoMapperHelper,这样以后使用AutoMapper就变的SOEASY了~ usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Data......
  • 大数据mapReduce的学习
    .2MapReduce模型简介•MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce•编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算•MapReduce采用“分而治之”策略,一个存储在分布式文件系......
  • 205-303 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.17-3.3
    一、水平自动扩容和缩容HPA(K8S版本>=1.23.x)HPA全称HorizontalPodAutoscaler,Pod水平自动伸缩,HPA可以基于CPU利用率replicationcontroller、deployment和replicaset中的pod数量进行自动扩缩容。pod自动缩放对象适用于无法缩放的对象,比如DaemonSetHPA由KubernetesAPI资源和控......
  • 解决:Exception: URL fetch failure on https://storage.googleapis.com/tensorflow/tf
    首次装载IMDB数据集时可能会出现的错误。解决方案:1、先将数据集单独下载下来:datasets/imdb.npz·黄健/keras-datasets-Gitee.com2、将其复制到 ~/.keras/dataset目录下:cpimdb.npz ~/.keras/dataset ......
  • Metropolis Algorithms for Representative Subgraph Sampling
    目录概主要内容MetropolisgraphsamplingH\¨{u}blerC.andKriegelH.,BorgwardtK.andGhahramaniZ.Metropolisalgorithmsforrepresentativesubgraphsampling.ICDM,2008.概提出了一种尽可能保持拓扑结构的子图采样方法.主要内容假设我们有一个大图\(G\),......
  • 【Django | 开发】中间件配置(记录响应耗时日志)
    ......
  • Go内存管理
    1.存储基础知识1.1计算机的存储体系从上至下依次是:CPU寄存器、Cache、内存、硬盘等辅助存储设备、鼠标等外接设备说明:从上至下,访问速度越来越慢,访问时间越来越长1.2内存1)物理内存通过物理内存条而获得的内存空间,这种存储是没有写入硬盘的,在计算机关机后就会丢失2)虚拟内......
  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task #celery包  这个包可以放在任意位置│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数│├──add_task.p......
  • 第二十八篇——一通达信板块函数INSUM、BLOCKSETNUM简介以及应用(从零起步编写通达信指
    有人问:统计指数成分股的收盘价高于20日均线的数量占比(0%~100%),如何编写成副图指标?这种指标公式属于代码不多,难度不小的类型。如果平时编写板块方面的指标比较少,相关板块函数不常用,那需要花点时间研究。 一、所需函数1、STKNAME含义:获取品种名称 2、HYBLOCK......