随笔 - 62  文章 - 0  评论 - 1  阅读 - 19987

Go语言学习 _基础04 _Map&Set

Go语言学习 _基础04 _Map&Set

1、map
package map_test

import (
   "fmt"
   "testing"
)

func TestInitMap(t *testing.T) {
   m1 := map[int]int{1: 1, 2: 4, 3: 9} // 初始化方式一 声明 并初始化
   t.Log(m1[2])
   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) // key-walue : int-int cap = 10
   // 初始化方式三 通过 make函数 (map 的 key 和 value 都不是 确定的 大小可能不一 所以 map的 make方法 没有len参数)
   t.Logf("len m3 = %d", len(m3)) 
}

func TestAccessNotExistingkey(t *testing.T) {
   m1 := map[int]int{}
   t.Log(m1[1])
   m1[2] = 0
   t.Log(m1[2]) // 对于不存在的 键值 会被 默认输出 0 ,那么这样和 初始化wei0 就很难区分了 吗? Go中 需要进行手动的 区分
   m1[3] = 0
   isExit(m1, 3)
   isExit(m1, 4)
}

// TODO 手动判断 键值 是否存在
func isExit(m map[int]int, k int) {
   if v, ok := m[k]; ok {
      fmt.Printf("Key %d 's value is %d", k, v)
   } else {
      fmt.Printf("Key %d is not exiting !", k)
   }
}

func TestTravelMap(t *testing.T) {
   m1 := map[int]int{1: 1, 2: 4, 3: 9}
   for k, v := range m1 {  // 通过range遍历 map
      t.Log(k, v)
   }
}
// 通过 Map 实现 工厂模式 TODO 以后 后面会 加一个 Java 实现的 比较 看看 Go 的简洁
func TestMapWithFunValue(t *testing.T){
   m := 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}
   t.Log(m[1](2),m[2](2),m[3](2))
}
2、set

Go语言中 没有 set 不过 可以 通过 Map 来 模拟 set 使用 key 作为 集合元素 使用 bool 作为 值 true 表示 存在

package set_test

import (
   "fmt"
   "testing"
)
 // TODO Go语言中 没有 set 不过 可以 通过 Map 来 模拟 set 使用 key 作为 集合元素 使用 bool 作为 值 true 表示 存在
func TestMapForSet(t *testing.T) {
   mySet := map[int]bool{}
   mySet[1] = true
   n := 3
   isExiting(mySet, n)
   mySet[3] = true
   t.Log(len(mySet))
   delete(mySet, 1) // 删除 元素
   isExiting(mySet, n)
}
func isExiting(set map[int]bool, k int) {
   if  set[k] {
      fmt.Printf("%d  is exiting", k)
   } else {
      fmt.Printf(" %d is not exiting !",k)
   }
}
posted on   OwlInTheOaktree  阅读(50)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示