一、 配置Go语言及其开发环境
Mac配置:http://t.zoukankan.com/zsy-p-6685889.html
https://wenku.baidu.com/view/8aeec92b15fc700abb68a98271fe910ef12daeaf.html?wkts=1673764660043&bdQuery=%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AEgo+pathmac
二、基础语法
package main
import (
"fmt" // 引入输入输出包fmt
)
func main() { //主要函数main
fmt.Println("HelloWorld")
}
使用以下命令运行该代码
go run \main.go
使用以下命令可以将该代码编译成二进制文件
go build \main.go
1.变量类型
主要变量包括整形、字符型、布尔型和字符串,其中字符串为内置类型,两个字符串的拼接可以用+直接拼接,两个字符串的比较也可以直接实用等于号
定义变量的方法如下:
var a = 10086 //定义变量a,这种方法定义变量不需要指明类型
f := float32(e) // 定义变量f,这种定义方法可以知名类型
const h = 50000 // 定义常量,常量无固定类型,根据使用时确定类型,但是其二进制形式保持不变
使用案例如下:
package main
import "fmt"
func main() {
var a = "init"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + " foo"
fmt.Println(a, b, c, d, e, f, g)
}
2.选择语句
go语言的if中无括号,而后面必须加大括号
import "fmt"
func main() {
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
}
switch语句
go使用switch语句一旦遇到了合适的case则会执行并跳出switch,不需要使用break跳出。并且go的switch语句可以不写switch条件,而直接在case中写条件。这可以用于替代多个if-else语句,并且拥有更高的性能。示例如下:
switch语句
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("morning")
case t.Hour() >= 12 && t.Hour() < 18:
fmt.Println("afternoon")
}
}
3.循环语句
for语句
package main
import "fmt"
func main() {
l := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for l <= 3 {
fmt.Println(l)
l++
}
}
4.数组
func main() {
var a [5]int
a[4] = 100
fmt.Println(a[4], len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
}
5.切片slice
切片是可变长的数组,比定长数组使用得更频繁
func main() {
s := make([]string, 3) // 使用make函数新建数组
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println(s)
s = append(s, "d") // 在切面后面追加元素
s = append(s, "e", "f")
fmt.Println(s)
c := make([]string, len(s))
copy(c, s) //复制切片操作
// 切片的切片操作
fmt.Println(c[3:])
fmt.Println(c[:4])
fmt.Println(c[1:3])
}
6.Map
func main() {
m := make(map[string]int) // 创建一个key为string,value为int的map
m["one"] = 1 // 添加操作
m["two"] = 2
fmt.Println(m)
fmt.Println(m["one"]) // 查询操作
delete(m, "one") //删除操作
}
7.Range
对于slice或者map可以使用range快速遍历,使用起来更方便,示例如下
func main() {
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if i == 2 {
fmt.Println("index", i, ",value", num)
}
}
fmt.Println(sum)
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v)
}
}
对切片的range会返回切片的下标和对应的值,而对于map的range则会返回其键值对。
8.函数
函数中变量类型倒置,可以返回多个返回值,其结构如下:
func 函数名(形式参数) 返回值 {}
返回值有多个的时候使用()将其括起来
9.指针
10.结构体
为结构体定义方法。带指针的结构体方法可以对结构体进行修改
可以将某个函数定义为某个结构体所属的函数,类似于Java中的成员类型,其格式如下
func (结构体变量名 结构体名)函数名(参数) (返回值类型){ }
如果传入的是结构体指针,则可以在函数内对结构体进行修改
type user struct {
name string
password string
}
func (u user)checkPassword(password string)bool{
return u.password == password
}
// 在函数内对原结构体进行修改,需要传入指针
func(*u user)resetPassword(password string){
u.password = password
}
错误处理
字符串操作
格式化输出
使用%v输出任意类型,%+v打印出字段名和值,%#v会打印出结构体和其中的值和字段名
JSON操作
JSON的序列化和反序列化
结构体中将所有字段名都首字母大写便可通过Marshal()函数进行序列化转化为JSON对象
字符串转化
0表示自动识别原字符串进制