这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
Go语言上手基础语法
变量与常量
Go是一门强类型语言,每一个变量都有自己的类型 Go的变量通过var来定义 常量则通过const声明 命名原则一般用驼峰命名法 声明方式
const num = 1000
var a = "hello"
var a,b int = 1,2 //在变量名后面加类型
f :=float32(4.00) //用:=声明 类型要包裹值
ifelse语句
Go中if else语句与C++,js不同,条件语句不需要加括号但是结尾需要马上加上花括号{},else要紧接在if语句结束之后 不能换行
for循环
Go中没有whlie和do-while循环 只有for循环; 使用方式和C++类似 但也是在循环语句后必须加上{}
switch
switch option{
case 1: //
case option://
default:
//
}
数组
var name [len] type
name := [len] tyoe {数组内容}
//定义数组语句
//数组中没有赋值的索引会被模式设为0
//二维数组
var name [l_len][r_Len] type //定义二维数组
//遍历数组用for循环语句实现
切片
切片不同于数组 其长度是可变的 切片通过make来创建 可以向数组一样使用 还有取出操作 类似于js的数组切片方法
s := make([]type.len)
通过append(name,value)添加 在末尾插入 如果容量不够可以自动发送扩容并返回一个新的切片
s = append(s,"a")
用copy()来把一个切片拷贝到另外一个切片
c := make([]string,len(s))
copy(c,s) //第一个参数是为目标,第二个参数为拷贝对象
map
键对 一个键对应一个值 (完全无序)
//声明方法
m := make(map[string]int) //map(键的类型) +键值的类型
m :=map[string](int){}
//添加kv对
m["key"] = value
//删除键对 用delete关键字
delete[key]
//判断键值是否存在 1.定义两个变量对应一个map的键
//2.如果键存在 返回键值给第一个参数 返回bool值true给第一个参数
// 否则返回一个空值给第一个参数 返回flase给第二个参数
r,ok := map[key]
range
range可用于遍历数组和map
for i,num := range arr/map {} //如果不需要索引的话 可以用下划线_忽略
- 第一个值返回数组的索引或map的键 第二个值返回对应数组的值或键值
func函数
在go语言中 函数的定义需要在函数名前加关键字func 它的位置放在main()函数之上 返回值类型或名称都放在函数后面 一般函数都回两个值,一个是需要的返回值,一个是错误类型;
func add(a int, b int) int{}//返回值类型
指针
指针的常用用途就是对常用的参数进行修改
func add1 (n int){
n += 2 //只是对传入的参数进行拷贝 并没有发生实质性的修改
}
func add2 (n *int){
*n += 2 //n发生了改变
}
func main(){
n:=5
fmt.println(add1(n))
fmt.printlb(&n) //在调用时须在前面加上& 才能实现类型的匹配
}
结构体
带类型字段的集合 没有初始话的结构体就会是空值 定义方法:
type name struct{
name type
value type
}
name.value = xxx //通过.来读取或写入 类似于C++
结构体也能作为函数的参数 有指针和非指针两种用法:使用指针可以修改函数的值 在大型结构体的拷贝中可以有效减少开销
结构体方法
结构体方法即类成员函数,可直接由.字段名字调用 操作便携
- 定义方法: func (u user)函数名() 返回类型 //在定义时 一定要在func后面紧接结构体类型才能实现
错误处理
go语言的错误处理通常用range来实现 自带error包;用range遍历返回第二个参数为错误类型
引用文章:Go错误处理
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.username == name {
return &u, nil //如果存在则返回数值和空
}
}
return nil, errors.New("not found") //如果不存在则返回nil 和抛出空错误
}
我们还需要在main函数中做一些处理返回 如果错误不为空 则返回函数 否则运行时可能会发生错误
//eg:
if err != nil {
fmt.Println(err)
return
}
字符串操作
标准库string里面有很多操作函数 一些例子如下:
a := "hello"
fmt.Println(strings.Contains(a, "ll")) //true //判断字符串是否包含字段 如果包含则返回true
fmt.Println(strings.Count(a, "h")) //1 //字符串计数
fmt.Println(strings.HasSuffix(a, "he")) // true //
fmt.Println(strings.Index(a, "he")) //0 //返回字符串的位置
fmt.Println(strings.Join([]string{"he", "w"}, "-")) //he-w //join同过sep拼接字符串
fmt.Println(strings.Replace(a, "e", "E", 1)) //hEl lo //替换特定位置的字符串
fmt.Println(strings.Split("a-b-v","-")) //以sep拆分字符串并返回一个新的数值[a b c]
字符串格式化
-
Print:输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)
-
Println:输出到控制台并换行
-
Printf:只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形 等)
-
Sprintf:格式化并返回一个字符串而不带任何输出
-
Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
对于结构体
- %v 按照每种数据类型的默认占位符格式化
- %+v 添加字段名(如结构体)
- %#v 相应值的Go语法表示
- %T 相应值的类型的Go语法表示
- %% 字面上的百分号,并非值的占位符
- %.f 打印浮点数 点后面为保留位数
JSON处理(important)
- 对于已有的结构体 只需保证每个字段的首字母是大写的即可
- 只要保证上述条件的结构体就能用json.Marshal()示例化
- Json.Marshal会返回一个buf数串 使用string(buf)可强制转换为字符串 否则会打印出一些16进制的编码
- panic()处理error的手段
- json.Unmarshat(Json,&target) //反示例化到并传递给target 此处的b前一定要加& 把Json传入并改变参数值而不是简单的拷贝一下
time
通过time包对时间处理
now := time.now()获取当前时间
进程处理
- os.Args //获取进程在执行时的一些命令行参数
- os.Getenv //获取环境变量
- os.Setenv //写入环境变量
- exec.Command().CombinedOutput() //获取子进程输入输出