这是我参与「第五届青训营 」伴学笔记创作活动的第1天
1、定义变量的两种方式
1.1 使用var定义
var a = 1 或者同时注明变量类型 var a int = 1 , 需要注意的是int写在变量名的后面,也可以同时定义多个变量var a,b in = 1,2。
1.2 使用 := 定义
如 a := 1
1.3 定义常量只需在前面加上const
2、判断语句if else
与c语言不同的是,第一,判断条件不需要加括号;第二,无论判断体是否只有一句代码,都必须加上大括号。
3、循环,仅有for循环
与c语言不同的是,循环条件不需要加括号。
4、switch语句
与c语言不同的是,第一,分支条件不需要加括号;第二,不需要加break 。
注:golang的switch可以代替if语句,并且在某个case中true后,将自动break。
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
5、定义数组的两种方式
5.1 使用var定义
需要注意的是,使用var定义数组必须在数组长度后标明类型,如var a [100]int 。
5.2 使用 := 定义
如b := [5]int{}
6、切片——“可变长度的数组”
6.1 定义切片
使用make定义,如s := make([]string, 3) 。
6.2 追加切片
使用apeend追加,需要注意的是,必须把返回值赋值给原切片,如s = append(s, "e", "f")
6.3 拷贝切片
可使用copy拷贝切片,如copy(c, s)
6.3 取切片元素
s[2:5]表示取切片s第2个到第5(不包括)个元素。
7、map
7.1 定义map
同样使用make定义,需要注意的是,此时需注明两个类型,中括号里的是key类型,中括号外为value类型,如m := make(map[string]int)
7.2 添加key
直接使用m["one"] = 1
7.3 删除key
delete(m, "one")
7.4 取元素
可以用另一个变量接受是否存在该key,若存在为true,若不存在为false,如r, ok := m["unknow"] 。
8、 使用range遍历slice或map
8.1 遍历数组
返回两个值,第一个索引,第二个为对应位置的值,若不需要索引,可以用下划线代替。
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
}
}
8.2 遍历map
返回两个值,第一个为key,第二个为value 。
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
9、函数
需要注意的是,实参类型需后置,返回类型也需后置。
func add(a int, b 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
}
10、指针
与c语言类似
11、结构体
11.1 定义结构体
struct后置,字段类型后置。
type user struct {
name string
password string
}
11.2 初始化结构体
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
没有初始化的类型为0或null
12、结构体方法,类似于c++类成员函数
在func与函数名之间加上结构体信息即可定义。
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
13、错误处理
需要增加一个返回类型为error的返回值。
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
注:指针、切片、映射、通道、函数和接口的零值则是 nil
14、字符串操作
略
15、字符串格式化
没有c语言的繁琐,无论打印什么类型,都用%v,%+v表示打印详细信息,%#v表示打印更详细的信息。
s := "hello"
n := 123
p := point{1, 2}
fmt.Println(s, n) // hello 123
fmt.Println(p) // {1 2}
fmt.Printf("s=%v\n", s) // s=hello
fmt.Printf("n=%v\n", n) // n=123
fmt.Printf("p=%v\n", p) // p={1 2}
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}
f := 3.141592653
fmt.Println(f) // 3.141592653
fmt.Printf("%.2f\n", f) // 3.14
16、JSON处理
每个字段名首字母大写。 使用json.Marshal()序列化,也可以使用json.Unmarshal()反序列化。
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a)
17、时间处理
略
18、数字解析
略
19、进程信息
略