青训营第一课--Go语言从入门到放弃(不是) | 青训营笔记

96 阅读3分钟

Go语言基础课程-笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

基础语法

基本代码结构

package main  //代表文件属于程序的入口文件
import "fmt"  //导入fmt包,用于输入输出字符串,格式化字符串
func main() {
    fmt.Println("hello world!")
}

变量类型

类似C

变量申明

var [变量名] = [值] 自动推导变量类型 var [变量名] [变量类型] = [值] [变量名] := [值]

var a = "initial"
var b,c int = 1,2
f := float32(e)

常量声明即将var改为const即可,也可自动确定类型

常用代码结构

if-else

结构类似C if后无需括号,若有,保存时也会自动去掉 if后必须接大括号,不能将语句写道同一行

for循环

没有while,do-while 类似if-else,不用加括号 直接跟大括号即为死循环(while) 可以用continue和brake

switch-case

同样的switch后的变量无需加括号 case条件后无需brake即跳出switch语句 甚至可以取代if-else

数组 --由于数组长度固定,较少使用

var a [5]int

切片 --替代数组

s := make([]string, 3)

实际上存储了容量,长度和指向数组的指针 可变长度的数组,可以任意时刻更改长度

s = append(s, "d") //追加一个元素,必须赋值回原切片(容量不够会扩容,因此必须赋值回去)
len(s)    //返回切片长度
copy(c,s) //将切片s的数据复制给c
s[2:5]    //类似python的操作,取出第二到第四个元素
s[:5]     //取出开头到第四个元素
S[2:]     //取出第三个到末尾的元素

map --其他语言中的hash或字典 使用最频繁的数据结构

m := make(map[string]int)  //使用make函数创建,map后中括号中是key的类型,后续跟的是value的类型
m["one"] = 1  //赋值
len(m) //返回长度
r, ok := m["unknow"] //获取有没有这个key存在,并将值返回给r(不存在为0?)
//输出时的顺序无序
range

可用于遍历切片和map 需要两个值 切片是索引和值、map是key和value 只需要其中一个的话可以将另一个用下划线去忽略

for i,num := range nums {}
for k,v := range m {}

函数 支持返回多个值,一般第一个返回值,第二个返回错误信息 指针 仅支持对传入参数进行修改,传入结构体时也可避免拷贝大结构体时的开销

func add2ptr(n *int){
    *n +=2
}
//调用
add2ptr(&n)
//类似C#中的ref?
结构体
type user struct {
    name string
    password string
}

可以初始化时指定初始值也可只指定一部分的值,未指定的为空值(0、'')

a := user {name: "wang", password: "1024"}
b := user {"wang","1024"}
c := user {name: "wang"}
c.password = "1024"
var d user

其他代码结构

结构体方法

func (u user) checkPassword(password string) bool {}
a.checkPassword("1024")  //true

类似于类成员函数,可以通过[结构体的命名].[方法名] 调用

错误处理

函数定义时定义一个err error 返回时有错误返回nil,error.New("[错误类型]") 无错误返回[正常返回值],nil 引用函数后可以通过if-else进行错误处理

字符串函数

类似C# 调用时strings.[函数名] ([参数])

strings.Repeat(a,2)//重复输出两次
strings.NewReader("hello") //将字符串转换成流

字符串格式化

Println 自动打印并换行 Printf 类似C

%v 任意类型, %d数字, %s字符串, %.2f浮点

%+v 多打印出变量名 %#v 在%+v基础上再打印出构造名称等