昨天的笔记没有记录全基础部分,今天再写一篇。
1.map(映射)
map类似于字典或者哈希,存储键值对 创建一个map,在这里使用make函数创建是一个不错的方式
s := make(map[string]int)
s[`one`] = 1
fmt.Println(s[`one`])
当然也可以用下面这种方式在初始化时直接赋值,需要注意的是,即使是只有一个元素也需要有逗号
s := map[string]int{
"one":1,
}
fmt.Println(s["one"])
一些其他应用
val, ok := m[key] // 若键存在,ok为true,val为对应的值;若键不存在,ok为false,val为零值
delete(m, key) // 根据键删除键值对
//循环遍历
for key,value := range s{
fmt.Println(key,value)
}
2.range
在这里只写一下对数组的遍历,因为会返回索引值,如果不想要索引值,用下划线取代即可忽略
s := []int{1,2,3,4}
for _,num := range s{
fmt.Println(num)
}
3.函数
go里面喜欢把数据类型写在后面,比如新建一个map:
s:= map[string]int
在创建函数时也一样,函数的返回值类型是写在参数列表后面,如果是多个返回值就用括号,并且根据老师所说在实际应用中一般都是多返回值
func add1(a int,b int)int{
return a+b
}
func add2(a,b int){
fmt.Println(a+b)
}
func exist(m map[string] int, k string) (v int,ok bool){
v,ok = m[k]
return v,ok
}
4. 指针
指针主要的作用是对传入的参数进行修改,例如第一个函数就只是对参数的拷贝进行操作,第二个函数使用了指针才能实现真正的修改
func add2(n int){
n += 2
}
func add2ptr(n *int){
*n += 2
}
func main() {
m := 2
add2(m)
fmt.Println(m)
add2ptr(&m)
fmt.Println(m)
}
5.结构体
从上面指针那里得出,传入的参数在函数中会进行一份拷贝再进行其他操作,因此在这里如果传入的参数是结构体,可以使用指针,避免拷贝大结构体带来了资源的消耗
type user struct {
name string
passwd string
}
func checkPasswd(u *user, passwd string) bool {
return u.passwd == passwd
}
func main() {
var a = user{`xm`, `12345`}
b := user{name: `xm`, passwd: `12345`}
var c user
c.name = `xm`
c.passwd = `12345`
fmt.Println(a, b, c)
fmt.Println(checkPasswd(&c,`1234`))
}
下面记录一下结构体函数,类似类的成员函数,可以用a.xxx这种形式使用
type user struct {
name string
passwd string
}
func (u *user) resetPasswd(passwd string){
u.passwd = passwd
}
func(u *user) chechPasswd(passwd string) bool{
return u.passwd == passwd
}
func main() {
var a = user{`xm`, `12345`}
a.resetPasswd(`123`)
fmt.Println(a.chechPasswd(`12345`))
}