GO语言开学第一课 基础语言篇 | 青训营笔记

159 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记

GO语言上手-基础语言

首先介绍GO语言的背景和特点

1.GO语言具有高性能、高并发的特点。

2.GO语言语法简单,学习曲线平缓。虽然类似于C语言,但进行了C语言简化,比如去掉了while循环,只需要for循环一种表示方法即可。

3.GO语言有丰富的标准库。不需要调用第三方的库,就可以进行一些基本的开发,并且安全性更高,这是其他语言所不具备的特点。

4.GO语言有完善的工具链

5.GO语言有静态链接

6.GO语言能够快速编译

7.GO语言具有跨平台性

8.GO语言有垃圾回收的功能,无需考虑内存的分配和释放,从而更好的专注于业务逻辑。

GO语言的入门

go语言的开发环境

1.  下载GOlang。
2.  使用VScode或者IDE编辑器
3.  配置环境变量

学习新语言的必经之路:Hello World!

package main

import "fmt"

func main(){
    fmt.Println("Hello World!")
}

GO语言的变量类型:

go语言中字符串可以直接用+进行拼接,你也可以用拼接后的字符串赋值给一个新定义的变量,并且这个变量会被go默认取值为字符串变量类型。

变量的声明两种方法

var name int = 2

name := 3//go语言中不需要加分号!

golang中if else 和 switch循环

golang中if 后没有括号,如果你写有括号,那么在保存时编译器会去除你的括号。if 和else 后边必须带有花括号,不能将代码和if写在同一行。switch 后不用括号,并且每一行结尾会默认加break。

golang切片:

切片是一个可变长度的数组,并且切片是引用传递,数组是值传递。你可以任意时刻更改切片的长度。切片可以用make创造,并且分配容量。切片可以用append追加容量和数值,但增加后必须要有一个接收值,他对于原切片并不会改变。

golang中slice实际上是存储了一个 长度加容量加上一个指向数组的指针。如果你append的过程中该切片容量不够,则会发生扩容,这个时候就需要返回一个新的切片,所以必须赋值回去。你也可以用copy拷贝切片数值。

s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2])// c
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)// [a b c d e f]
fmt.Println(s[2:5])//这里表示的是打印切片中从下标为2到下标为4的数值,不包括下标为5的数值  c d e
fmt.Println(s[:5])//这里表示打印从切片的首位打印到下标为4的数值,不包括下标为5的数值   a b c d
fmt.Println(s[2:])//这里表示打印从切片下标为2处到切片末尾的数值。
//c d e f

go语言中的map

map[key]value的数据类型

map["NO1"] = 1
map["NO2"] = 2//写入
fmt.Println(m) //map[NO1:1 NO2:2]
fmt.Println(m["NO1"])//1 读取
r, ok := m["unknow"]//r为接收value,ok用来判断map中是否有这个key存在。
fmt.Println(r, ok)//0 false
delete(m, "NO1")//通过delete来删除map中的key
//快捷创建map
m2 := map[string]int{"NO1":1, "NO2":2}
var m3 = map[string]int{"NO1":1, "NO2":2}

注意:map中的数据是完全无序的,他不会按照输入的先后顺序输出。

go语言中的range

  • 使用range可以快速遍历
  • 遍历数组的时候会返回两个值,第一个值为数组下标,第二个值为数组下标所对应的值。
  • 遍历map的时候 第一个返回值是key 第二个值是value(遍历的结果也是随机出现的,因为map是无序的。)

go语言中的函数

  • golang中函数变量类型写在变量之后,返回值类型也写在最后,开头必须用func
  • golang中的指针主要作用就是修改值传递为引用传递,使函数中的内容得到全局修改。

golang中的结构体

   name     string
   password string
}//结构体的定义方法
//结构体方法的定义
func (u user) checkPassword(password string) bool {
	return u.password == password//判断数据
}

func (u *user) resetPassword(password string) {
	u.password = password//修改数据
}

func main() {
    //结构体的快速设置变量以及赋值的方法
    c := user{name: "wang"}
    c.password = "1024"
    c.resetPassword("2048")
    fmt.Println(c.checkPassword("2048")) // true
}

结构体也是一种值传递。如果想要修改传入的数据需要借助于指针。结构体方法和函数不同。注意引用的方法首字母一定要大写(语法要求)!引用其他包的时候,所定义的函数或方法如果首字母是小写,则只可以在原包中使用而无法被其他包所调用!!!并且你如果声明了一个变量并且没有去使用它,那么系统也会报错(是红红的那种!)

golang中的错误处理

  • 在定义一个函数时,可以返回一个error错误类型(需要引入error包)如果发生了错误就返回一个错误信息,否则返回一个空值。
  • 在调用这些定义了error返回值的函数时,也需要接收两个值,判断是否错误时,只需判断error的返回值是否为nil。

golang中的字符串操作

	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
  • strings.Contains 判断一个字符串中是否包含另一个字符串
  • strings.Count 符串计数
  • strings.Index 判断另一个字符串在这个字符串中首次出现的下标位置
  • strings.Join 在指定位置的字符串中加入某些字符串
  • strings.Repeat 重复打印n次字符串
  • strings.Replace 把全部的e替换为E,-1表示全部替换 正数表示替换几个
  • strings.Split 替换指定字符串为空
  • strings.ToLower 打印小写的字符串
  • strings.ToUpper 打印大写的字符串
  • 一个中文占据3个字节

golang中的json

  • 对于字段首字母大写的结构体,都可以用json.Marshal将其序列化。也可以以使用json.Unmarshal(序列化, &结构体变量)进行反序列化。

golang中的时间处理

  • time.Now()快速获取当前时间。
  • time.Data()构造一个带时区的时间。
  • 可以用sub来对时间进行一个减法,然后获得时间差
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
diff := t2.Sub(t)
fmt.Println(diff)                           //1h5m0s
  • Format格式化时有一个特定的时间 :2006-01-02 15:04:05

总结:在golang中的语法更加严谨,代码更加简洁。我是一名大一的学生,非常高兴有机会来到青训营学习,在这里结识了不少同伴。虽然我有很多地方不懂,但是我会尽力做到要求。成长本来就需要历练,我会一直坚持和努力下去,我相信结营那一天我会在这里学习到人生中宝贵的财富,并且体会到青训营所带给我的快乐!