这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Go语言的特点
高性能,高并发
语法简单,学习曲线平缓
丰富的标准库
完善的工具链
静态链接
快速编译
垃圾回收
跨平台
//简单的http服务器
package main
import "net/http"
func main() {
http.Handle("/",http.FileServer(http.Dir(".")))//把斜杠指向一个静态路由的实现
http.ListenAndServe(":8080",nil)//增加8080端口,启动服务器
}
配置开发环境
安装Golang or 配置集成开发环境(VSCode下载Go插件)
基础语法 - Hello World
package main//mian包的一部分,程序的入口包(入口文件)
import "fmt"//导入fmt包,作用:格式化输入输出
func main() {
fmt.Println("Hello World")
}
fmt包主要用于格式化输入输出。函数如Printf,Dprintf,Fprintf等,可以格式化输出字符串,Scanf,Sscanf,Fscanf等,可以读取格式化字符串
基础语法 - 变量
变量声明的两种方式:
1,使用var关键字
var age int
var name string
2,通过简写的方式声明变量,如:
age := 18
name := "John"
基础语法 - if else
Go与C++、java不同,if后面没有括号,形如:if x < 25。如果加上括号,编辑器会在运行前自动去掉。
使用示例:
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
Go中if-else语句括号位置被严格限制,改动会出现语法错误
基础语法 - switch
switch语句中的变量可以是任何类型,可以是一个常量或者一个变量,在每个case后面可以跟多个值,用逗号隔开
Go中的switch语句也支持在条件判断语句前执行简单的语句,这样就可以在一个switch语句中处理多个条件
使用示例:
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
基础语法 - 数组
Go数组跟其他语言都差不多,如长度固定等
基础语法 - 切片
切片 (slice) 是一种对数组的抽象,可以让你动态地管理数组中的元素。切片是一个指向底层数组的指针,并且包含了指针、长度和容量这三个属性
切片的初始化如:
var slice []int = array[0:5]
切片可通过下标访问数组中的元素,且支持切片赋值和切片比较操作。 切片可以通过内置函数make()来创建,如:
//make([]type, len, cap)
//cap可缺省
s := make([]string, 3)
切片也可以通过内置函数append()来动态地增加元素。
slice := []int{1,2,3}
slice = append(slice, 4, 5)//slice = [1 2 3 4 5]
基础语法 - map
Go语言中的map是一种内置数据结构,用于存储键值对。键必须是可比较的数据类型(如字符串、整数等),值可以是任何数据类型。map可用于统计字符串中单词出现次数或维护用户信息数据库等任务。可以使用make函数创建新的map
map遍历时完全无序的,不会按照字母或者插入顺序,与C++中unordered_map类似
m := make(map[string]int)
package main
import "fmt"
func main() {
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
}
基础语法 - range
在 Go 中,range 关键字用于遍历数组、切片、字符串、map 和通道中的元素。对于数组、切片和字符串,它将返回每个元素的索引和值。对于 map,它将返回每个键和值。对于通道,它将返回每个从通道中接收到的值。
package main
import "fmt"
func main() {
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
}
基础语法 - 函数
Go中函数与其他语言中的类似,但函数定义时的格式有所不同
func, 函数名称,参数和返回值
Go语言函数支持多个返回值,可更加灵活的使用和定义函数
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res) // 3
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok) // A True
}