Go语言基础 | 青训营笔记

64 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的许多工具和功能的强大则会指引我越来越深入得去学习后端知识,经历过青训营之后,我会将所学应用到学习生活中,更细致得了解后端开发技术,学习的东西很多,希望自己可以坚持下来。