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基础上再打印出构造名称等