Go基础及实战 | 青训营笔记

82 阅读3分钟

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

知识点

1.变量

(1)变量定义

var a = "initial"var b, c int = 1, 2var d = truevar e float64

(2)常量定义

const s string = "constant"
const h = 500000000
const i = 3e20 / h
2.循环

(1)for循环(唯一)

跟c类似,只是少了括号,

for n := 0; n < 5; n++ {
    if n%2 == 0 {
        continue
    }
    fmt.Println(n)
}
3.判断

(1)if语句

跟c类似,但是判断语句内可在判断条件上加定义变量

if num := 9; num < 0 {
    fmt.Println(num, "is negative")
} else if num < 10 {
    fmt.Println(num, "has 1 digit")
} else {
    fmt.Println(num, "has multiple digits")
}

(2)switch语句

a := 2
switch a {
case 1:
    fmt.Println("one")
case 2:
    fmt.Println("two")
case 3:
    fmt.Println("three")
case 4, 5:
    fmt.Println("four or five")
default:
    fmt.Println("other")
}
4.数组与切片

(1)数组

var a [5]int
a[4] = 100  //赋值
b := [5]int{1, 2, 3, 4, 5}  //也可以这样赋值
var twoD [2][3]int  //二维数组 

(2) 切片

我感觉就是动态数组

s := make([]string, 3) //定义
s = append(s, "d") //在加一个元素,也就是下标为3的元素
5.map

跟c++的stl自带的map用法类似

m := make(map[string]int) // 定义
m["one"] = 1 // 插入数据
r, ok := m["two"] //第二个元素为bool,代表是否找到该元素
fmt.Println(r, ok) // 0 false
delete(m, "one") //删除元素
6.遍历

(1)range遍历数组

nums := []int{2, 3, 4}
for i, num := range nums {} //第一个代表下标,第二个代表值

(2)range遍历map

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {} //第一个代表关键字,第二个代表值
7.函数

格式:func 函数名 (参数1,参数2,...)(返回值类型1,返回值类型2...){}

func exists(m map[string]string, k string) (v string, ok bool) {
    v, ok = m[k]
    return
}
func exists(m map[string]string, k string) (string,bool) {
    v, ok := m[k]
    return v, ok
}
//以上两种返回值等价,区别在于是否在返回值处定义变量
​
v, ok := exists(map[string]string{"a": "A"}, "a") //函数调用
8.指针

跟c类似,多应用才函数调用

func add2ptr(n *int) {
    *n += 2
}
add2ptr(&n)  //修改n的值,若不使用指针,则无法修改n的值,结构体亦如此
9.结构体

(1)结构体定义及数据处理

type user struct {
    name     string
    password string
} 
//结构体定义
​
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
//结构体插入数据
​
​

(2)结构体方法

也就是给结构体设置内置函数

func (u user) checkPassword(password string) bool {
    return u.password == password
}
​
func (u *user) resetPassword(password string) { //使用指针才可修改值
    u.password = password
}
​
a.resetPassword("2048") //调用
10.输出

(1)fmt.Println( ) 语句

很智能,相当于c++中的cout?直接在括号里面写入想输出的变量名

(2)fmt.Printf( ) 语句

跟c的printf类似,但也很方便,只需%v即可输出任何类型的变量

fmt.Printf("s=%v\n", s)  // s=hello
fmt.Printf("n=%v\n", n)  // n=123
fmt.Printf("p=%v\n", p)  // p={1 2}
fmt.Printf("%.2f\n", f) // 3.14
11.时间处理

需要import “time”

(1)获取当前时间

now := time.Now()// 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933

(2)输出年月日等信息

fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute())
// 2022 March 27 1 25

(3)时间差diff的应用

diff := t2.Sub(t)
fmt.Println(diff)                           // 输出差了多久 如 1h5m0s
fmt.Println(diff.Minutes(), diff.Seconds()) // 输出差了多少分钟,多少秒 如 65 3900
12.数字解析

需要import “strconv”

(1)把字符串转成浮点型

f, _ := strconv.ParseFloat("1.234", 64)//返回值为(float64 error)
fmt.Println(f) // 1.234

(2)把字符串转成int型

n, _ := strconv.ParseInt("111", 10, 64)//第二个参数为进制 返回值为(int64 error)
fmt.Println(n) // 111

也可以默认10进制

n2, _ := strconv.Atoi("123")
fmt.Println(n2) // 123

注意:进制代表字符串是多少进制,最终结果输出均为10进制