Golang中的map
在别的语言中,map一般被叫做哈希或者字典,在实际开发中使用最频繁的数据结构。
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) //map[one :1, two :2]
fmr.Println(len(m)) //2
fmt.Println("one") //1
r, ok := m["unknow"] //利用 ok 语句可以查询 map 中是否具有某个元素。
fmt.Println(r, ok) //0 false
delete(m, "one") //删除map中指定的元素
//另一种定义的方法
m2 := map[string]int{"one": 1, "two": 2}
fmt.Println(m2) //注意,打印map的输出时是完全随机的!
Golang中的range
我们可以利用range来循环遍历Golang中的map和数组。
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index:", i,"num", num) //index: 0,num:2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b B a A
}
for k := range m {
fmt.Println("key", k) //key a; key b
}
Golang中的函数
Golang中的函数传入值的类型确认是后置的,同时也支持返回多个值,一个是真正的返回结果,另一个是错误信息。
func add(a int, b int) int { //后面的int是确认返回值类型
return a + b
}
func add2(a, b int) int { //也可以这样定义
return a + b
}
func exists (m map[string]string, k string) (v string, ok bool){
v, ok = m[k]
return v, ok // xx true/false
}//这里就返回了一个变量和一个bool值
Golang中的指针
Golang中的指针用法没有C++那么多,最常用于修改传入函数中参数的值。
func add2(n int) {
n += 2
}
func add2ptr(n *int) {
*n += 2
}
//在调用时 指针传参要用&当前缀
n := 5
add2(n)
fmt.Println(n) //5
addptr(&n)
fmt.Println(n) //7
Go 具有足够少的关键字,内置并发机制,没有特定的线程库(Java 的 Thread,PHP 的 thread 扩展),开启一个线程只需要一个关键字 go,即可享受多线程带来的高性能,内置了 CAS 特性的 atomic 库,以及常规的锁机制 sync 包,Go 主张 通过通信来共享内存,而不是通过共享内存来通信,通过 chan 这种数据结构来进行线程之间通信,共享内存资源。Go 开发并不需要特别关心内存的使用,因为其自身自带了垃圾回收器,帮助我们很好的管理了内存的使用。