这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.Go语言的特点
高性能、高并发、语法简单学习曲线平缓、丰富的标准库、完善的工具链、静态链接、快速编译、跨平台、垃圾回收机制、适合web业务、部署简单、内置RPC和HTTP框架的推广。
2.Go入门
1.开发环境
安装Golang go.dev
Golang中国镜像 studygolang.com/dl
配置代理 goproxy.cn/
基于云环境开发线上试用开发系统 gitpod.io/#github.com…
2.基础语法
- hello world
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
- var
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
const s string = "constant"
const h = 500000000
const i = 3e20 / h
输出结果
initial 1 2 true 0 0
initialfoo
constant 500000000 6e+11 -0.28470407323754404 0.7591864109375384
- for
无限循环
for {
fmt.Println("loop")
break
}
普通for循环
for j := 7; j < 9; j++ {
fmt.Println(j)
}
类似于c的while循环
for i <= 3 {
fmt.Println(i)
i = i + 1
}
- if语句
if-else
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
- switch
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("other")
}
输出
two
- array
初始化
初始化的位置全为0
var a [5]int
初始化二维数组
var twoD [2][3]int
- slice(切片)
fmt.Println(s) // [a b c d e f]
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]
- 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
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
fmt.Println(m) //map[two:2]
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
- range
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
- func 函数定义
func add(a int, b int) int {
return a + b
}
- point 指针
package main
import "fmt"
func add2(n int) { //像是复制了
n += 2
fmt.Println(n) // 7 注意
}
func add2ptr(n *int) { //像是借走了,还要还的
*n += 2
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5 注意
add2ptr(&n)
fmt.Println(n) // 7
}
- struct 结构体
type user struct {
name string
password string
}
func main() {
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"
// {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
}
- 异常处理
import (
"errors"
"fmt"
)
type user struct {
name string
password string
}
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")
}
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}
输出:
wang
not found
- 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 占位符
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
3.学习心得
虽然go语言之前没有接触过,但是根据以往学习编程的经验,很多思路都是共通的,倒也省下许多理解的时间,只需先记住代码格式即可入门,而go的许多工具和功能的强大则会指引我越来越深入得去学习后端知识,经历过青训营之后,我会将所学应用到学习生活中,更细致得了解后端开发技术,学习的东西很多,希望自己可以坚持下来。