前言
在极客上看了蔡超老师的Go语言课程 随手记下来的一些随笔,Go的基础应用及实例, 系列内容比较偏基础,推荐给想要入门Go语言开发者们阅读。
目录如下
Go语言基础学习 (一) - 变量 常量已经与其他语言的差异
Go语言基础学习 (二) -Go语言中的类型转与Go语言中的数组切片
Go语言基础学习 (三) - Go语言内的 Map声明使用与工厂模式
Go语言基础学习 (四) - Go语言函数简单介绍
Go语言基础学习 (五) - 面向对象编程
Go语言基础学习 (六) - 编写一个好的错误处理
Go语言基础学习 (七) - 包(package)
Go语言基础学习 (八) - 并发编程
1. Map声明,元素访问 及遍历
-
关键函数还是make 可以用作切片(slice),map,通道(channel)关键点: 当生成一个空
map时m1 :=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 .") } }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与工厂模式
-
简单版的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 } -
实现一个SetGo的内置集合中没有
Set的实现,但是我们可以使用map[type]bool来去实现一个Set实现操作
-
元素的唯一性
-
基本操作
添加元素,判断元素是否存在,删除元素,元素个数
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: 可以把map的value设置成一个函数来实现工厂模式set: 在go语言内没有内置set的情况下,使用map来使用set相同的特性
3. 字符串
-
字符串存储在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应用包函数strings包: golang.org/pkg/strings…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 }