Go基础入门|青训营笔记
一、环境配置
1.go安装
比较简单,这篇博客一直跟下来,比较流畅(2条消息) Go语言环境安装及配置go 安装ThrAvicii的博客-CSDN博客
但就是其中的GOPATH在设置了自定义点的路径后发现命令行里还是默认的c盘的路径,后来发现是用户变量里不知道怎么就突然加上了一个GOPATH,有可能是安装的时候自动加的吧,删了就行
2.MinGW安装
博客地址Windows 平台下 LiteIDE 的安装和使用_iteye_11495的博客-CSDN博客
记得配置环境变量的时候%MINGW_HOME%\bin这个“\”一定不要丢,我一开始写成\去命令行就没运行gcc -v就出现了找不到命令的情况
3.安装LiteIDE
还是上面那个博客里有讲,这个我倒是没遇到什么安装问题
但是运行第一个程序时,报了一个错
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
Build process exiting with code: 1 signal: null
去网上查发现
go1.11之后引入了go.mod工具
但启用go.mod工具需要两个条件:
- 设置GO111MOUDLE为on
- 有一个go.mod文件
我报这个错就是因为没有go.mod文件,解决办法:
go mod init//创建go.mod文件
go mod tidy//自动将go.mod和import中的依赖同步
二、入门
1.一些值得注意的与其他语言有不同的点:
- Go语言编译比较严格,导入了不需要的包或者定义了未使用的变量都无法通过编译(Go语言编译没有警告这一说)
- 行末不需要加分号,因为Go语言会把换行符转换为分号;但也正因此,换行符的位置就会影响到程序的编译。(比如函数的左括号{必须和func函数的声明在同一行且位于末尾;在表达式x+y中可在+后换行,但不能在+前换行)
- 代码格式严格还有一个好处是方便自动源码转换
2.命令行参数:
- os包里,os.Args变量是一个字符串的切片:os.Args[0]是命令本身的名字,其他元素是程序启动时传给它的参数
-
注意go中的自增是一条语句! 因此
j=i++是不合法的,而且++--都只能放在变量后面,--i也非法 -
go语言只有for循环这一种循环语句,有多种形式:
-
for initialization; condition; post{ //initialization和可post均省略,都省略时可以不写分号,此时相当于while循环 //三个循环部分不需括号包围 //终止循环可用break或return } -
//在某种数据类型的区间上遍历 func main() { s, sep := "", "" for _, arg := range os.Args[1:] {//range要求必须处理索引值,但此处又没用到故用_空标识符来接收索引值 s += sep + arg sep = "" } fmt.Println(s) }
-
-
变量声明
-
短变量声明:最简洁但只能用在函数内部,不能用于包变量
s := "" -
依赖于字符串的默认初始化零值机制,被初始化""
var s string -
用得比较少
var s = "" -
显式标明变量的类型,变量类型和初值类型不同的时候变量类型是必须的
var s string = ""
-
5.ifelse
- if后的条件没有括号,if执行体的内容必须要用大括号括起来
- switch中不用加break也会执行满足条件的case语句后直接结束匹配过程;变量可以是字符也可以是结构体等等;也可以一开始在switch后面不写,在case后用xx.xx来判断
3.基础语法
1.切片
s := make([]string,3)
s[0] = "a"
s[1] = "b"
s = append(s,"c")//必须要append再赋值回去给s,因为会返回长度、容量、指向切片的指针,要是容量不够需要新开一片空间
2.map
m := make(map[string]int)//string是key类型,int是value类型
3.函数
func add(a int,b int) int{
return a+b
}//函数返回两个值,第一个是返回值,第二个是错误信息,return部分也可以返回多个值
4.类成员函数
func (u *user)resetPassword(password string){
u.password = password
}
5.错误处理,在函数返回值后面加一个err
func findUser(users []user,name string)(v *user,err,error){
//...
if ... {
return $u,nil
}
return nil,error.New("not found")
}
6.字符串操作
常见函数
Contains,Count,Index,Join,Repeat,Replace,Split,ToLower,ToUpper,len(a)...
7.字符串格式化
%v
%+v:更详细,有字段和值
%#v:更详细,包括了整个结构体的类型名称,字段和值
8.JSON
import (
"encoding/json"
"fmt"
)
//结构体每个字段首字母大写
type userInfo struct{
Name string
Age int `json:"age"`
Hobby []string
}
a := userInfo{Name:"wang",Age:18,Hobby:[]string{"Golang","Typescipt"}}
//序列化
buf,err := json.Marshal(a)
//输出
fmt.Println(string(a))//{"Name":"wang","Age":18,"Hobby":[..]}
//反序列化
var b userInfo
err = json.Unmarshal(buf,&b)
9.时间处理
import (
"fmt"
"time"
)
now := time.Now()
t := time.Date(2023,5,17,10,30,22,0,time.UTC)
fmt.Println(t)//2023-5-17 10:30:22 +000 UTC
fmt.Println(t.Year(),t.Mouth())//2023 May
t.Format("2006-01-02 15:04:05")//2023-5-17 10:30:22
now.Unix()//获取时间戳
10.数字解析
f,_ := strconv.ParseFloat("1.234",64)//返回的是一个64位的float
n,_ := strconv.ParseInt("111",10,64)//10是进制,64是位数
n1,_ := strconv.Atoi("123")