Go基础语法| 青训营笔记

54 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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、进程信息