Go基础入门|青训营笔记

67 阅读4分钟

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.一些值得注意的与其他语言有不同的点:

  1. Go语言编译比较严格,导入了不需要的包或者定义了未使用的变量都无法通过编译(Go语言编译没有警告这一说)
  2. 行末不需要加分号,因为Go语言会把换行符转换为分号;但也正因此,换行符的位置就会影响到程序的编译。(比如函数的左括号{必须和func函数的声明在同一行且位于末尾;在表达式x+y中可在+后换行,但不能在+前换行)
  3. 代码格式严格还有一个好处是方便自动源码转换

2.命令行参数:

  1. os包里,os.Args变量是一个字符串的切片:os.Args[0]是命令本身的名字,其他元素是程序启动时传给它的参数

image.png

  1. 注意go中的自增是一条语句! 因此 j=i++是不合法的,而且 ++ --都只能放在变量后面,--i也非法

  2. go语言只有for循环这一种循环语句,有多种形式:

    1. for initialization; condition; post{
          //initialization和可post均省略,都省略时可以不写分号,此时相当于while循环
          //三个循环部分不需括号包围
          //终止循环可用breakreturn
      }
      
    2. //在某种数据类型的区间上遍历
      func main() {
          s, sep := "", ""
          for _, arg := range os.Args[1:] {//range要求必须处理索引值,但此处又没用到故用_空标识符来接收索引值
              s += sep + arg
              sep = ""
          }
          fmt.Println(s)
      }
      
  3. 变量声明

    • 短变量声明:最简洁但只能用在函数内部,不能用于包变量

      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")