这是我参与「第五届青训营 」笔记创作活动的第1天
1.Go语言特点及应用
Go语言特点:
(1)高性能、高并发 (2)语法简单、学习曲线平缓 (3)丰富的标准库 (4)完善的工具链(编译、代码格式化、错误检查、帮助文档、单元测试框架....) (5)静态编译 (6)快速编译 (7)跨平台 (8)垃圾回收
2.Go语言应用
Go语言在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展,并有一定的市场占有率。 字节跳动已经全面拥抱了Go语言。
开发环境
- 安装Golang
- 配置集成开发环境(VSCode、GoLand)
3.基础语法-Hello World
package main
//main包是程序的入口包,该文件也是入口文件
import (
"fmt"
)
func main() {
fmt.Println("Hello")
}
4.基础语法-变量
变量声明两种方式
var b,c int =1,2
f := "11"+"22"
5.基础语法-if else
写法 if 条件 {} 条件没有()语句写在{}里边。
6.基础语法-循环
Golang中只有for循环,且不加()
7.基础语法-switch
switch只经过一个case,默认有switch,switch后面可以写字符串、结构体。
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
default:
fmt.Println("other")
}
switch后面不加任意变量,case后面可以写条件当做if使用,比多个ifelse清晰易懂。
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("小于12")
default:
fmt.Println("大于12")
}
8.基础语法-数组
数组可以方便读取特定索引的值,但在真实的业务里,由于数组的长度是固定的,所以很少使用数组。
var array[5] int
array[4] = 100
array2 := [5]int{1,2,3,4,5}
var array3[2][3] int
for i:=0;i<2;i++{
for j:=0;j<3;j++{
array3[i][j] = i+j
}
}
8.基础语法-切片
切片不同于数组,它是可变长度的数组。
//使用make创建切片
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
//使用append加入元素
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
//与python类似的切片功能
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
9.基础语法-map
//make方法创建map
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
//ok获取map中是否有该键
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
10.基础语法-range
range可以用来遍历数组、map
//遍历数组
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
}
}
fmt.Println(sum) // 9
//遍历map
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
}
11.基础语法-函数
Go 语言的函数可以返回多个值,第一个值是真正的返回结果,第二个值是错误信息。
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
12.基础语法-指针
指针的用途是对传入的参数进行修改
func add2(n int) {
n += 2 //不会更改传入的参数
}
func add2ptr(n *int) {
*n += 2 ////更改传入的参数
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n)
fmt.Println(n) // 7
}
12.基础语法-结构体
带类型的字段的集合
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
fmt.Println(a, b, c, d)//{"wang","1024}{"wang","1024}{"wang","1024}{"wang","1024}
结构体方法,和类中的成员函数相似。带有指针的会改变结构体中的数据。
type user struct {
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() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
}
13.基础语法-错误处理
- 在 Go 语言中,错误处理是一个重要的部分。Go 提供了一种简单的方法来处理错误,即将错误作为函数的返回值。
- 在 Go 中,错误是一个内置的 error 类型,该类型实现了 error 接口。在错误发生时,函数可以返回一个 error 值。
- 在Go语言中,
nil是一个特殊的值,可以赋值给任何有引用类型的变量或数据结构(如指针、切片、映射或通道)。它表示缺少值,等价于其他编程语言中的null。当一个变量或数据结构设置为nil时,表示它不指向任何有效的内存位置。尝试访问或使用值为nil的变量或数据结构可能会导致运行时错误。
14.基础语法-字符串操作
a := "hello"
//判断该字符串中是否包含另一个字符串
fmt.Println(strings.Contains(a, "ll")) //true
//计数
fmt.Println(strings.Count(a, "l")) //2
//接受一个字符串和一个前缀作为参数,并判断该字符串是否以该前缀开头。如果是,函数返回 true,否则返回 false
fmt.Println(strings.HasPrefix(a, "he")) //true
//接受一个字符串和一个后缀作为参数,并判断该字符串是否以该后缀结尾。如果是,函数返回 true,否则返回 false
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 b := "你好"
//获取字符串的长度,一个中文会对应多个字符 fmt.Println(len(b)) //6
15.基础语法-字符串格式化
%v、%+v 和 %#v是格式化动词,都能输出变量的值,但是会越来越丰富