Go语言基础学习 (三) - Go语言内的 Map声明使用与工厂模式,字符串

257 阅读3分钟

前言

在极客上看了蔡超老师的Go语言课程 随手记下来的一些随笔,Go的基础应用及实例, 系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。

目录如下

Go语言基础学习 (一) - 变量 常量已经与其他语言的差异
Go语言基础学习 (二) -Go语言中的类型转与Go语言中的数组切片
Go语言基础学习 (三) - Go语言内的 Map声明使用与工厂模式
Go语言基础学习 (四) - Go语言函数简单介绍
Go语言基础学习 (五) - 面向对象编程
Go语言基础学习 (六) - 编写一个好的错误处理
Go语言基础学习 (七) - 包(package)
Go语言基础学习 (八) - 并发编程

1. Map声明,元素访问 及遍历

image-20220211151118726.png

  • 关键函数还是make 可以用作切片(slice),map,通道(channel)

    关键点: 当生成一个空mapm1 :=map[int]int{} 里面的初始化默认值是为0 ,但是这个0是不存在的 不可调用,在实例中如何判定map中是否存在值 看下方例子

        func TestAccessNotExistingKey(t *testing.T)  {
           m1 := map[int]int{}
           m1[2]  = 0
           t.Log(m1[2])  // 0   为赋值0  做判定处理时 会是true状态
           t.Log(m1[3])  // 0   为初始化默认0
    
           if v,ok :=m1[3]; ok{
              t.Log("key 3's value is",v)
           }else {
              // 结果是为空,因为初始化时的0 是为空 相等于 null false  在做判定时是直接被判定空值
              t.Log("key 3 not existing .")
           }
    
       }
    

    image-20220211172455085.png

    m1[3] 初始化时未赋值,所以默认初始化时为0 是为空 相等于 null false 在做判定时是直接被判定空值 , 当我们将判定if 替换成m1[2]时,此时赋值的0生效 判定成功 值存在

    func TestAccessNotExistingKey(t *testing.T)  {
       m1 := map[int]int{}
       m1[2]  = 0
       t.Log(m1[2])  // 0   为赋值0  做判定处理时 会是true状态
       t.Log(m1[3])  // 0   为初始化默认0
    
       if v,ok :=m1[2]; ok{
         // 结果为存在  判定为true
         t.Log("key 3's value is",v)     // key 3's value is 0
       }else {
          t.Log("key 3 not existing .")
       }
    
    }
    

2. Map与工厂模式

image-20220214150542431.png

  • 简单版的map工厂实例
     package map_ext_test
    
     import "testing"
    
     func TestMapWithFunValue(t *testing.T)  {
             m:=map[int]func(op int)int{}   // 创建一个map初始化定义 
             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))   // 2  //  通过下标元素来访问 已经设置好的不同函数
             t.Log(m[2](2))   // 4
             t.Log(m[3](2))   // 8
     }
    
  • 实现一个Set

    Go的内置集合中没有Set的实现,但是我们可以使用map[type]bool 来去实现一个Set

    实现操作

    1. 元素的唯一性

    2. 基本操作

      添加元素, 判断元素是否存在, 删除元素, 元素个数

        func TestMapForSet( t *testing.T)  {
            mySet := map[int]bool{}  //创建一个set 函数
            mySet[1] = true   //  设置k-v值
            n := 1
            if mySet[n]{   // 判断值是否存在
                    t.Logf("%d is existing",n)
            }else {
                    t.Logf("%d not existing",n)
            }
    
            mySet[2] = false     
            delete(mySet,1)  // 删除指定k值
            t.Log(len(mySet)) // 获取元素长度 1
        }
    
  • 总结

    map : 可以把mapvalue设置成一个函数来实现工厂模式

    set : 在go语言内没有内置set的情况下,使用map来使用set相同的特性

3. 字符串

image-20220214162337950.png

  • 字符串存储

    在go里面 string的存储是以byte来计算len ,当存储16进制的字符串式,又会与字母,数字等byte不同

     func TestString(t * testing.T)  {
    
             var a string
    
             t.Log(a)   // 输出是为 '' 
    
             a = "hello"
    
             t.Log(len(a)) // 重新赋值后 长度为5
    
             var b  = "\xE4\xB8\xA5" // 新声明一个,写入字符编码
             t.Log(b)   // 输出 严
             t.Log(len(b))  // 长度为3  以字符编码\分byte 
     }
    
  • 字符串package应用包函数
    1. strings包golang.org/pkg/strings…
    2. strconv包golang.org/pkg/strconv…

    简单使用实例

    func TestStringFn(t * testing.T)  {
    
      s := "a,b,c"
      parts := strings.Split(s,",") //  字符串分割
    
      t.Log(parts)  // [a b c]
      for _,part := range parts  {
          t.Log(part)
      }  // a
         // b
         // c
      t.Log(strings.Join(parts,"-")) // 字符串链接 // a-b-c
    }