map数据类型
类比字典
声明/初始化
m:=map[string]int{
"one":1,
"two":2,
"three":3
}
m1:=map[string]int{}
m1["one"]=1
m2:=make(map[string]int, 10)
len(m2)
为什么map初始化没有len ?
length:一般初始化都会为‘零值’, 但是map是没有 ‘零值’, 字典/map的零值:就是:{}
不支持cap函数的访问!!
map的访问
m:=map[int]int
t.Log(m[1])
m[2]=0
t.Log(m[2])
if v,ok:m1[3];ok{
}else{
}
字典map的访问,返回的是双值,一个是v,表示本身的值,一个是status状态,bool类型,表示key是否存在
map遍历
关键字 for
m:=map[string]int{
"one":1,
"two":2,
"three":3
}
for key,v:range m{
}
map与工厂模式
- map的value可以是一个方法(或者说object)
- 与go的Dock type 接口方式一起,可以方便的实现单一方法对象的工厂模式
单元测试示例:
package map_ext
import "testing"
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))
}
集合Set:不存在与go的数据结构
go的内置集合中没有set的实现,可以使用map[type]bool的方式实现
实现Set
func TestMapForSet(t testing.T) {
myset:=map[int]bool{}
myset[1]=true
n:=1
if myset[n]{
}else{
}
s:=3
if myset[s]{
}else{
}
len(myset)
delete(myset,n)
}
golang-string类型
- string是数据类型,不是引用或者指针类型
- string是只读的byte slice,len函数可以测量出它所包含的byte数–差异
- string的byte数组可以存放任何数据
func TestString (t testing.T){
var s string
t.Log(s)
s = 'hello'
t.Log(len(s))
s = "\xE4\xB8\xA5"
t.Log(s)
t.Log(len(s))
s = "\xE4\xB8\xBB\xA5"
t.Log(s)
t.Log(len(s))
s = "hello"
}
unicode和utf8
- unicode是一种字符集 又叫 code point
- UTF8是unicode的存储实现(转换为字节系列的规则)
示例:
func TestUnicode (t testing.T) {
var s string
s = "中"
t.Log(len(s))
c := []rune(s)
t.Log(len(c))
t.Logf("中 unicode %x", c[0])
t.Logf("中 UTF8 %x", s)
}
编码与存储
字符 | 中 |
---|
unicode | 0x4E2D | UTF-8 | 0xE4B8AD | string/[]byte | [0xE4,0xB8,0xAD] |
常用的字符串函数
遍历一个字符串
for
s:="中华人民共和国"
for _,v:=range s {
t.Logf("%[1]c %[1]d", v)
}
相关函数
strings
import "strings"
func TestStringFunc (t testing.T) {
s:="A,B,C,D"
parts:=strings.Split(s, ",")
for _,v:=range parts {
t.Log(v)
}
t.Log(strings.Join(parts, "-"))
}
strconv
import "strconv"
func TestConvfunc (t testing.T) {
s:=strconv.Itoa(10)
t.Log("str"+s)
if i,err:=strconv.Atoi("10");err==nil{
t.Log(10+i)
}
}
|