这是我参与「第五届青训营 」伴学笔记创作活动的第1天。初次接触Go语言,希望能有所收获。
一、本堂课重点内容
- 简介
- 开发环境
- 基础语法
- 标准库
- 猜谜游戏
- 命令行词典
- SOCKS5代理
二、详细知识点介绍
1. 简介
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语言有了初步的认识,希望之后的学习顺利。