go语言入门

118 阅读4分钟

Go基础语言

开发环境

1.打开go.dev/安装Golang
2.配置集成开发环境,下载Visual Studio Code或GoLang.

基础语法-Hello World

1. package main //表示这个文件属于main包的一部分,是程序的入口文件
2.
3.import(
4.    "fmt"
5.)//表示导入标准库里的fmt包,fmt包用于打印字符,字符串等
6.
7.func main(){
8.    fmt.Println("hello world!")
9.}//main方法,调用fmt包,打印字符串

变量

1.类型:字符串(直接用“+”来拼接,也可以使用等于号来比较),整数,浮点型,布尔型
2.运算符的优先顺序和C语言很类似
3.变量声明:var 变量名 = 数据可自动推导变量类型或var 变量名 数据类型 = 数据自行定义数据类型或者变量名:= 数据例如i:=6

常量

1.定义:const 常量名 = 数据
2.无确定类型,会通过上下文自动确定类型。eg:

var a = 12
const i = 6//常量i为整数
var b int = a/i

语法if else

写法与C语言很类似,不同在于if后面没有括号。eg:

if 7%2==0 {
    fmt.Println("7 is even.")
} else {
    fmt.Println("7 is odd.")
}

循环

只有for循环。可以使用经典循环。eg:

for i=0;i<10;i++ {  //i=0,i<10,i++这三个语句任何一个都可以省略
    fmt.Println(i)
}

同样可以使用continue继续循环或break跳出循环

switch分支结构

与C语言也比较类似,同样是switch后面的变量名不用加括号。eg:

i:=1
switch i {
case 1:
    fmt.Println("one")
case 2:
    fmt.Println("two")
}

switch分支中默认不需要加break,找到对应的分支执行结束就会自动跳出switch语句,同时golang中的switch语句可以使用任意数据类型,甚至可以取代if else语句

数组

1.定义:var 数组名 [数组长度] 数据类型

切片

1.切片是可可变长度的数组,可以任意时刻去更改其长度。
2.定义:数组名 := make([ ]数据类型,长度 ) 3.切片可以用append去追加元素,但必须把append的结果赋值回原数组。eg:原数组 = append(数组名,追加的数据)
4.可以使用copy去拷贝两个数组的数据。eg:copy(c,s)即将数组s的数据拷贝到数组c中
5.取出数组中一部分的数据。eg:fmt.Println(s[2:5])即将数组s中第2个数据到第5个数据且不包括第五个数据打印出来

语法map

1.创建map:map名 := make(map[key数据类型]value数据类型)然后再通过语法写入配位对。eg:

m := make(map[ string ] int)
m["one"] = 1
m["two"] = 2
fmt.Println(m)//打印出map[one:1 two:2]
fmt.Println(m["one"])//打印出1

当[ ]中的数据不存在于map中时输出0
2.删除配位对:delete(map名,key)。eg:delete(m,"one")即删除map名为m中的配位对"one" = 1.
3.通过例如i,ok := m["unknow"]来判断是否在map中存在该配位对
4.map是完全无序的,遍历的时候不会按照字母顺序和插入顺序输出而是一个偏随机的顺序输出 ##语法range 对于数组和map,用range来遍历可以更加便捷,range遍历时对于数组会返回两个值,一个是索引,另一个是对应位置的值。eg:

for num := range nums{ //遍历数组nums,nums中有数据就将数据传给num后进入循环
     sum+=num
}
for k,v :=range m{//遍历map m,map中有配位对,就将配位对传给k,v后进入循环
     fmt.Println(k,v)
}

函数

1.加法:

func add(a int,b int) int{
       return a + b//返回单个值
}

2.业务逻辑上一般返回多个值,第一个是返回值,第二个是错误信息

func exists(m map[string]string,k string)(v string,ok bool){
       v, ok = m[k]
       return v,ok //返回值v和错误信息
}

指针

支持的操作有限,主要用途是对传入的数据进行修改。eg:

func add(n *int){
       *n += 2//对传入的数据进行修改
}

调用的时候要加&,就像add(&n)

结构体

1.定义:

type user struct {
      name        string
      password  string
}

2.传入初始值:

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

最终打印出都相同,也可以使用指针传入初始值

错误处理

使用单独返回值传递错误信息

字符串操作

strings包: Contains 判断一个字符串中是否还包含另一个字符串 Count 字符串计数 Index 查找某个字符串的位置 Join 连接多个字符串 Repeat 重复多次字符串 len 字符串长度

字符串格式化

fmt.println()打印多个变量并换行
fmt.printf("s=%v\n",s)可以用%v打印任任意类型的变量,其中%+v可以打印字段名字和值;%#v打印整个构造的名称,字段名字和值,%.2f打印保留两位小数的浮点数

JSON处理

对于已有的结构体,只需要保证每个字段首字母大写,就能进行JSON操作。用json.Marshal()进行序列化,然后会变成一个简单的数组,打印需要强制类型转换为string。

时间处理

time.now()获取当前时间 time.Date()构造时间 .sub对两个时间减法得到一个时间段