Go基础语法与实战day1|青训营笔记

46 阅读5分钟

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

1.Go语言特点及应用

Go语言特点:

(1)高性能、高并发 (2)语法简单、学习曲线平缓 (3)丰富的标准库 (4)完善的工具链(编译、代码格式化、错误检查、帮助文档、单元测试框架....) (5)静态编译 (6)快速编译 (7)跨平台 (8)垃圾回收

2.Go语言应用

Go语言在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展,并有一定的市场占有率。 字节跳动已经全面拥抱了Go语言。

开发环境

  1. 安装Golang
  2. 配置集成开发环境(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.基础语法-错误处理

  1. 在 Go 语言中,错误处理是一个重要的部分。Go 提供了一种简单的方法来处理错误,即将错误作为函数的返回值。
  2. 在 Go 中,错误是一个内置的 error 类型,该类型实现了 error 接口。在错误发生时,函数可以返回一个 error 值。
  3. 在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是格式化动词,都能输出变量的值,但是会越来越丰富