Go学习笔记(一)Go语言基础及实战案例|青训营笔记

81 阅读4分钟

Go语言基础及实战案例

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,今天主要学习Go语言基础

Go语言简介

Go语言优点

  • 高性能、高并发
  • 语法简单、学习曲线平缓
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

开发入门

安装

Golang下载链接: https://go.dev https://studygolang.com/ https:goproxy.cn/

开发环境

  1. VsCode(使用go插件)
  2. Goland(付费软件)

基础语法

  1. hello world

go程序入口是main函数

  • 程序运行指令:go run helloworld.go
  • 编译指令go build helloworld.go 再输入./helloworld即可运行
  1. 变量

go是强变量类型,每个变量都有其类型,字符串是go内置类型,可以直接通过+拼接

变量赋值几种方式:

//变量
var a = 'initial'
var b,c int=1,2
d:=float32(b)
//常量
const e string ="str"
  1. if else 不需要小括号,判断语句写在if后面,中间隔一个空格,大括号不能另起一行,直接写在if语句后面
  2. 循环 只有一种循环:for
//死循环
for{
fmt.Println("loop")
break
}
//完整for循环写法
for j:=7; j<9; j++ {
    fmt.Println(j)
}

for i<=3{
    i=i+1
}
  1. switch
  • 不需要break
  • switch后可以接任意类型(包括自定义结构)
  • switch后可以不加变量,在大括号里的case语句进行判断,用来替换ifelse语句
  1. 数组(不常用

定义

var a[5] int
  1. 切片(常用

注意⚠️:slice中存储的有数组长度、容量和一个指向数组的指针,当前数组扩容后如果容量不够则会返回一个新的slice

s:=make([]string, 3)
s[O]="a"
s[1] ="b"
s[2]="c"
fmt.Println( "get:", s[2])//c
fmt.Println( "Len:"Len(s))//3

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.Printin(c) 
//切片区间是左闭右开
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]

  1. map

键值对 使用delete语句删除元素 map中的元素是无序的,打印的时候不会按照字母顺序或存储顺序输出

  1. range

可以使用range对数组和map进行快速遍历

  • 对于数组,range会输出两个变量:索引(可以用下划线忽略)和对应位置的值
  • 对于map,返回两个值分别是key和value
  1. 函数

函数返回两个值:一个是真正的返回值,第二个是错误信息

package main
import "fmt"
func add(a int, b int) int {
    return a + b
}
func add2(a, b int’ int {
    return a + b
}
func exists(m map [string]string, k string) (v string, ok bool) {
    V,ok = m[k]
    return v, ok
}
func main(
{
    res :=add( 1, 2)
    fmt.Println(res)

    v,ok := exists(map [stringlstring("a":“A"},“a")
    fmt.Println(v, ok // A True
}
  1. 指针 go中的指针只能对参数进行一些运算操作,作用比较有限
  2. 结构体
  • 赋值用:=
  • 结构体内变量引用.
  • 结构体作为参数时有指针和非指针
  • 将结构体参数写在func后方法名前就可将这个方法定义为类成员方法,类对象可以用.调用该方法
  1. 错误处理
  • 在函数返回值中定义一个error,返回的时候就可以返回错误信息,输出错误信息之前要判断一下error是否为空
  1. 字符串操作
func main() {
    a:="hello"
    fmt.Println(strings.Contains(a, “11"))// true
    fmt.Printin(strings.Count(a, “1")) // 2
    fmt.Println(strings.HasPrefix(a, “he"))// true
    fmt.printin(strings.HasSuffix(a, “llo"))// true
    fmt.Println(strings. Index(a, “11"))// 2
    fmt.Println(strings.Join( []string{"he", “1lo"},-"))// he-llo
    fnt.Println(stringsRepeat(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.Println()
  • 匹配符用%v(%+v输出变量名:值,%#v输出结构体整个构造和值
  • 浮点型匹配符用%.2f表示两位小数
  1. JSON处理
  • 成员变量名开头均为大写的结构体就可以用json中的Marshl方法进行序列化操作,
  • 序列化之后的变量需要强转成string类型才能以字符串的形式输出,如果想修改成员变量名字,则可以在结构体内该变量后加个tag(‘json:“age”’)
  • 反序列化:用Unmarshal
  1. 时间处理
  • time.Now()返回一个带时区的时间变量
  • time.Date()将给定值转化成日期格式
  • 格式化输出使用特定时间指定格式(2006-01-02 15:04:05)
  • 获取时间戳用time.Unix()
  1. 时间处理
  • 使用strconv包中的函数进行数据格式转换
f:strconv. ParseFloat( "1.234"64)
fmt.Println(f) //1.234

n:=strconv. ParseInt( "111"1064//10代表进制
fmt.Println(n) // 111
n, _ = strconv.ParseInt( "Ox1000"0, 64)
fmt.Println(n) // 4096
n2,:= strconv.Atoi( "123")
fmt.Println(n2) // 123
n2,err := strconv.Atoi("AAA")
fmt.Println(n2, err) // O strconv.Atoi: parsing "AAA":invalid syntax
  1. 进程信息
  • os.Arg获取当前进程的系统信息
  • os.Getenv、os.Setenv获取/设置环境变量
  • exec.Command启动子进程

案例