Go语言基础语法 | 青训营笔记

100 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

本堂课的重点

  1. go语言的特点和优势
  2. go的基本语法

详细内容

什么是 Go 语言

Go 语言是由 Google 开发的一门跨平台的编程语言,最早在2009年发布。

Go 语言具有如下特点:

  • 高性能、高并发。
  • 丰富的标准库。Go 语言提供了大量高质量的标准库。
  • 完善的工具链。在编译、格式化、质量检查、包管理、测试等方面拥有完善的工具链。
  • 静态链接。在代码编译之后以单个可执行文件作为构件,可将该可执行文件直接部署。
  • 快速编译。编译速度较快(相比于c++),同时支持增量编译。
  • 跨平台。可以在几乎所有的平台、架构下运行。同时自带交叉编译。
  • 垃圾回收。无需考虑内存管理。

go的变量形式与声明

四种声明方式:

var a = "initial"
var b, c int = 1, 2
var e float64
f := float32(e)

tips:用=一定有var,而是否写变量的类型其实都可以,只要后面接了值。

常用3、4种声明方式,一种是有初始值的声明,一种是没有初始值的声明。

变量类型:大致和c++类似,int,int64,float32,float64、bool、emum等。

循环

for init;condition;next;

只有for一种,上面这三个部分,任意去掉一个、两个或者全部去掉,都是可以的。

if 与 switch

	switch 变量 {
	case value:
		fmt.Println("one")

switch的用法:如果switch后面接了变量,那么判断变量与value是否相等,如果没有接变量,那么判断value是否非false。

tips:fallthrough,可用于替代if语句

array slice 和 map

声明方法:

s := make([]string, 3)
m := make(map[string]int)
copy(c, s) //复制slice

扩容机制

range

range用法:

for index, value := range nums{
}

for key, value := range map {
}

func point struct struct-method

对比下面两组区别: 谁是在做无用功

func checkPassword(u user, password string) {
	u.password == password
}

func checkPassword2(u *user, password string) {
	u.password == password
}

func (u user) checkPassword(password string) {
	u.password = password
}

func (u *user) resetPassword(password string) {
	u.password = password
}

常用库

errors库的使用:errors.New("string") string库:

	a := "hello"
	fmt.Println(strings.Contains(a, "ll"))                // true
	fmt.Println(strings.Count(a, "l"))                    // 2
	fmt.Println(strings.HasPrefix(a, "he"))               // true
	fmt.Println(strings.HasSuffix(a, "llo"))              // true
	fmt.Println(strings.Index(a, "ll"))                   // 2
	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
	fmt.Println(strings.Repeat(a, 2))                     // hellohello
	fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo
	fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
	fmt.Println(strings.ToLower(a))                       // hello
	fmt.Println(strings.ToUpper(a))                       // HELLO
	fmt.Println(len(a))                                   // 5
	b := "你好"
	fmt.Println(len(b)) // 6

fmt库:所有的类型都能用%v,%+v和%#v表示详细内容。%.2f表示保留几位小数 time库: strconv库:

	f, _ := strconv.ParseFloat("1.234", 64)
	fmt.Println(f) // 1.234

	n, _ := strconv.ParseInt("111", 10, 64)
	fmt.Println(n) // 111

	n, _ = strconv.ParseInt("0x1000", 0, 64)
	fmt.Println(n) // 4096

	n2, _ := strconv.Atoi("123")
	fmt.Println(n2) // 123

	n2, err := strconv.Atoi("AAA")
	fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax

os库: 这部分有点像python

	fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
	fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
	fmt.Println(os.Setenv("AA", "BB"))

	buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf)) // 127.0.0.1       localhost

课后个人总结:

总体来说,go语言简洁易懂,有点像python和c++的混搭。