Go基础语言 | 青训营笔记

114 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天。初次接触Go语言,希望能有所收获。

微信图片_20210213134305.jpg

一、本堂课重点内容

  • 简介
  • 开发环境
  • 基础语法
  • 标准库
  • 猜谜游戏
  • 命令行词典
  • SOCKS5代理

二、详细知识点介绍

1. 简介

image.png

2. 开发环境

STEP1: 安装Golang go.dev/

STEP2: 配置集成开发环境:VSCode(安装Go插件)

3. 基础语法

Hello World

一个简单的例子,输出hello world

package main

import(
    "fmt"
)

func main(){
    fmt.Println("hello word")
}

变量

用"=" / ":="初始化

// =
var a = "initial"
var b,c int = 1,2

// :=
f := float32(e)

常量

将声明变量的var改为const

const s string = "constant"
const h = 500
const i = 3e20 / h

if else

if后面的条件不加括号,if后面的内容必须加大括号

if 7%2 == 0 {
    fmt.Println("7 is even")
} else{
    fmt.Println("7 is odd")
}

循环

for后面的条件不加括号。可以没有条件,无限循环。

for{
    fmt.Println("loop")
    break
}

for j := 7; j < 9; j++ {
    fmt.Println(j)
}

switch

不加break也不会往下执行

a := 2
switch a {
case 1:
    fmt.Println("one")
case 2:
    fmt.Println("two")
default:
    fmt.Println("other")
}

数组

长度固定

var a[5] int
a[4] = 100
fmt.Println(a[4],len(a))

切片

长度可变

//创建
s := make([]string,3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

//扩充
s = append(s,"d")
s = append(s,"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["one"]) // 1

判断key是否存在

r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false

删除

delete(m,"one")

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
    }
}

m := map[string]string{ "a":"A", "b": "B"}
for k, v := range m{ //key和value
     fmt.Println(k, v) // b B; a A
}

函数

func add(a int, b int) int { //返回类型后置
    return a+b
}

func exists(m mao[string]string, k string) (v string, ok bool) { //返回两个值
    v,ok = m[k]
    return v, ok
}

指针

传递给函数能改变本身的值

func add2(n int) {
    n += 2
}
func add2ptr(n *int) { //传入指针
    *n += 2
}

n := 5
add2(n) //5
add2ptr(&n) //7  传入时用取地址符

结构体

定义

type user struct {
    name string
    password string
}

创建

a := user{"wang", "1024"}
b := user{name: "wang"}

成员

var d user
d.name = "wang"
d.password = "1024"

结构体方法

//定义
func (u user) checkPassword(password string) bool {
    return u.password == password
}

func (u *user) resetPassword(password string) { //使用指针可以改变结构体的值
    u.password = password
}

//使用
a := user{"wang", "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) //true

错误处理

引入error

import {
    "error"
}

使用

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") 
}

获取error

u, err := findUser([]user{{"wang", "1024"}}, "wang")

字符串

引入strings

import(
    "strings"
)

字符串操作

  • strings.Contains(str,"a") : 判断str中是否包含字符串"a",返回true/false

  • strings.Count(str,"a") : 统计str中"a"的数量

  • strings.Index(str,"a") : 返回"a"的位置

  • strings.Repeat(str,2) : 重复字符串

  • strings.ToLower(str) : 小写

  • strings.ToUpper(str) : 大写

  • len(str) : 返回字符串长度

字符串格式化

  • %v可以打印任何类型的的值
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.14159
fmt.Printf("%.2f\n",f) // 3.14

JSON处理

  • 结构体成员名第一个字母大写
  • json.Marshal() 序列化结构体,返回buf数组

时间处理

引入time

import {
    "time"
}

获取当前时间

now := time.Now()

创建

t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)

成员

fmt.Println(t.Year(), t.Month, t.Day(), t.Hour(), t.Minute())

数字解析

引入strconv

import {
    "strconv"
}

字符串转化为数字

strconv.ParseFloat("1.234", 64) //字符串 精度
strconv.ParseInt("111", 10, 64) //字符串 进制(为0表示自动) 精度
n, err := strconv.Atoi("123") //十进制字符串转数字

进程信息

引入os,os/exec

import {
    "os"
    "os/exec"
}

运用

os.Args
os.Getenv("PATH") //获取环境变量
os.Setenv("AA", "BB") //写入环境变量

exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()

三、实践练习例子

  • 财迷游戏

  • 命令行词典

  • SOCKS5代理

四、个人总结

一个语言需要学习的语法很多,这次也只是粗略地学习了一部分,更具体的内容之后用到时再去深入学习。通过这次基础语法学习,对Go语言有了初步的认识,希望之后的学习顺利。