Go语言基础 | 青训营笔记

85 阅读2分钟

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

笔记,还是自己的好!

Day1

走进 Go 语言基础语言

课程源码

视频

PPT

本节课作为本合辑课程的开篇之课,将为大家详细讲解 Go 语言的相关背景知识。从开发环境、基础语法和标准库出发,协助同学轻松入门。

简介

特点

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

在用公司

字节、谷歌、腾讯、Meta、美团、七牛云、滴滴、哔哩哔哩、百度、PingCAP.

package main

import (
        "fmt"
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir(".")))
        fmt.Println("Listening...")
        http.ListenAndServe(":8080", nil)
        fmt.Println("Waiting to serve") // 什么时候执行?
}
curl 127.0.0.1:8080
<pre>
<a href="http.go">http.go</a>
</pre>

入门

安装参考官网中国镜像GoModProxy

if else switch

msg := ""
// num 的作用域为if...else...。
if num := 2; num < 0 {
	msg = "不会打印本消息"
}else{
	msg = "打印本消息"
}
fmt.Println(msg)
//fmt.Println(num)
// 编译错误

// switch会自动break,case可以合并
// 甚至可以不带变量名num,此时跟多个if一样,不再是简单的枚举。
switch num {
    case 0:
    //doSomething()
	case 1, 2:
    // doOtherthing()
    default:
    // doDefaultthing()
}

for

没有while、do while。

// 其他语言
/*
while(condition){
	doSomething();
}
*/
// Golang
for condition {
	doSomething()
}

// 其他语言
/*
do {
	doSomething();
}while(condition);
*/
// Golang
for {
	doSomething()
	if !condition {
		break
	}
}

切片slice

/*
// 动态数组
type slice struct {
    array unsafe.Pointer  //指针
    len   int             //长度
    cap   int             //容量
}
*/

s := make([]int, 3)	//必须指定len,返回值为类型。(new返回指针。)
s = append(s, 1)
s = append(s, 2, 3)
s = append(s, []int{4,5,6}...)
fmt.Println(s)
// s: [0 0 0 1 2 3 4 5 6]
c := make([]int, 6)
copy(c, s)	// 能复制多少就复制多少,不报错
fmt.Println(c)
// c: [0 0 0 1 2 3]

映射map

m := map[string]int{"one": 1, "two": 2}
val, ok := -1, true
val, ok = m["unknwon"]
fmt.Println(val, ok)
// 0 false。返回"零值"0并覆盖val
delete(m, "one")

range

for index, value := range slice {
}
for key [, value] := range map 
}

结构体方法

type user struct {
	name	string
	pwd		string
}
// (u user)是类型,不会改变u.pwd
// just like func setpwd1(u user, pwd string)
func (u user) setpwd1(pwd string) {
	u.pwd = pwd
}
// (u *user)是指针,会改变u.pwd
// just like func setpwd2(u *user, pwd string)
func (u *user) setpwd2(pwd string) {
	u.pwd = pwd	// 与下面等价,go会预处理。
	//(*u).pwd = pwd
}
u := user{name:"zhangsan", pwd: "123456"}
u.setpwd1("654321")
fmt.Println(u.pwd)
// 123456
u.setpwd2("654321")
fmt.Println(u.pwd)
// 654321

错误处理

import "errors"

err := errors.New("Error Msg")
if err != nil {
    return
}

字符串

import "strings"
strings.xxx, xxx in :
Contains
Count
HasPrefix
Index
Join
Repeat
Split
ToLower
// 输出格式: "%[+#]v"

json

import  "encoding/json"
// json.Marshal -> json.MarshalIndent(obj, "", "\t") 带缩进
// json.Unmarshal

时间

Go不用 yyyy-mm-dd

2006-01-02 15:04:05,这个时间,要背?

Go1.20要新增的3个常量?

DateTime = "2006-01-02 15:04:05" DateOnly = "2006-01-02" TimeOnly = "15:04:05"

import "time"
time.xxx, xxx in :
Now().Unix()
Date
Year
Sub().Minutes()
Format
Parse()将字符串转成时间

func Parse

func Parse(layout, value string) (Time, error)

Parse解析一个格式化的时间字符串并返回它代表的时间。layout定义了参考时间Mon Jan 2 15:04:05 -0700 MST 2006在输入格式下的字符串表示,作为输入的格式的示例。同样的格式规则会被用于输入字符串。

t, e := time.Parse("2006-01-02-02TTTAny15:04:05", "2022-03-27-27TTTAny01:25:36")
if e != nil {
return
}
fmt.Println(t)
// 2022-03-27 01:25:36 +0000 UTC

strconv

ParseType(str, srcBase, retTypeLen)

Atoi(str) -> int

进程信息

import (
	"os"
	"os/exec"
)
os.Args
os.Getenv("PATH")
os.Setenv(key, value)
exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
// CombinedOutput: 执行命令并返回标准输出和错误输出合并的切片。
/*
$ grep '127.0.0.1' /etc/hosts
127.0.0.1       localhost
127.0.0.1       kubernetes.docker.internal
*/

实战

猜数字、在线词典、Socks5代理。