Go Day01
1.1什么是Go语言
![](https://img-blog.csdnimg.cn/img_convert/3d5a0b96c49c1b73d788c03e8ac80f33.png)
使用标准库即可开发高性能 、高并发应用程序(标准库功能十分强大,稳定)
基于C语言,且比C语言容易
循环只有for,遍历循环较为容易
适配多系统,树莓派等
垃圾回收,无须考虑内存释放
实例:
![](https://img-blog.csdnimg.cn/img_convert/09f11e162fd5a684a46270f245dd20b8.png)
简单的静态页面的代码
2.1开发环境
直接在golang官网安装,或者下载vsc编辑器后下载GO插件
在https://goproxy.cn网址按照教程配置第三方包,可以提高依赖的下载速度,该网站还有自托管 Go 模块代理的配置教程
golang学生可以免费申请使用,具体操作和idea免费申请类似
2.2.1基础语法--hello world!
packagemain
import (
"fmt"
)
funcmain() {
fmt.Println("hello world")
}
package main表示该文件属于main包的一部分,mian包即程序的入口包,该文件即程序的入口文件
导入标准库的fmt包:主要往屏幕输入输出字符串,格式化字符串(该操作类似C的导入头文件)
func main即主函数,调用fmt的println输出
运行该程序使用go run命令
生成二进制文件使用go build命令
鼠标放在Println上可以链接跳转包的官方文档,查看其他方法的使用方法,类似idea
2.2.2基础语法--变量
字符串是内置类型,类似string,可以直接用 + 拼接,也可以用 = 去比较两个字符串
变量的声明:
var 【name】 = 【value】
比如: var a = "initial"
会根据value自动匹配变量的类型,如果想直接确定类型,可以在【name】后直接将类型名标注
比如: var b, c int = 1, 2
或者
【变量名】 := 【value】
声明常量时,将var改为const
可以声明多个类型不同的变量(类型由初始化表达式推导):
vari, j, kint // int, int, int
varb, f, s=true, 2.3, "four"// bool, float64, string
packagemain
import (
"fmt"
"math"
)
funcmain() {
vara="initial"
varb, cint=1, 2
vard=true
varefloat64
f :=float32(e)
g :=a+"foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
constsstring="constant"
consth=500000000
consti=3e20/h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
2.2.3 基础语法 -- if else
和C基本类似
不同:
if和else if后没有条件判断的括号(小括号)且必须有花括号括住
packagemain
import"fmt"
funcmain() {
if7%2==0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if8%4==0 {
fmt.Println("8 is divisible by 4")
}
ifnum :=9; num<0 {
fmt.Println(num, "is negative")
} elseifnum<10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
}
2.2.4 基础语法 -- 循环
go 语言只有for循环一种
for后面什么都不写即代表死循环
可以使用经典的C语言的for循环,格式相同,同样也有continue和break的跳出循环方式
以下是集中for循环的使用方法
packagemain
import"fmt"
funcmain() {
i :=1
for {
fmt.Println("loop")
break
}
forj :=7; j<9; j++ {
fmt.Println(j)
}
forn :=0; n<5; n++ {
ifn%2==0 {
continue
}
fmt.Println(n)
}
fori<=3 {
fmt.Println(i)
i=i+1
}
}
2.2.5 基础语法 -- switch
go语言中Switch后面的变量名和if一样不需要括号
和C语言不同的是,C语言case语句后没有break默认走完所有case,
而go语言默认是不走的
在go中Switch还有更加高级的用法,可以在Switch后不加任何的变量名,而 在case后添加条件判断,可以代替if语句使条件的选择更加清晰,代码更加美观
packagemain
import (
"fmt"
"time"
)
funcmain() {
a :=2
switcha {
case1:
fmt.Println("one")
case2:
fmt.Println("two")
case3:
fmt.Println("three")
case4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t :=time.Now()
switch {
caset.Hour() <12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
2.2.6 基础语法 -- 数组,切片
1.普通数组
和C语法和使用方法基本相同
vara [5]int
a[4] =100
b := [5]int{1, 2, 3, 4, 5}
vartwoD [2][3]int
fori :=0; i<2; i++ {
forj :=0; j<3; j++ {
twoD[i][j] =i+j
}
}
2.切片
切片是一个可变长度的数组,类似java的list集合,可以随时追加元素
切片使用make创建,用append进行追加,需要注意追加后要返回切片(会自动进行扩容并返回新的长度)
使用append函数追加元素可以一次性追加多个元素,甚至可以直接追加一个切片
同样可以用copy函数拷贝切片
go也有类似Python的切片操作
fmt.Println(s[2:5]) // [c d e],打印2~5(不包括5)
packagemain
import"fmt"
funcmain() {
s :=make([]string, 3)
s[0] ="a"
s[1] ="b"
s[2] ="c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s=append(s, "d")
s=append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c :=make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
2.2.7 基础语法 -- map
使用过程中用到的最多的数据结构
同样,使用make创建
m :=make(map[string]int)
m["one"] =1
m["two"] =2
其中string是key的类型,int是value的类型
初始化一些map中的值
ages :=map[string]int{
"alice": 31,
"charlie": 34,
}
使用delete去删除
delete(m, "one")
在使用时可以在变量后面加一个ok来获取对应key索引的value是否存在如果存在变量为value,ok为true,否则,变量为对应类型的零值,ok为false
r, ok :=m["unknow"]
fmt.Println(r, ok) // 0 false
map是无序的,多次迭代会得到不同的结果
2.2.8 基础语法 -- range
一个迭代工具,可以快速遍历数组,切片,map等,类似java的foreach快速遍历
在迭代时可以同时输出对应的key和value