Go语言的特点
Go(也称为Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言旨在提供一种简单、高效和可靠的编程解决方案,适用于大规模软件开发。
1.高性能,高并发,语法简单,标准库丰富,工具链完善
2.有静态链接,可快速编译,跨平台,还有垃圾回收
Go语言环境配置
第一步:在该网址The Go Programming Language中下载安装Go语言
第二步:安装GolandJetBrains GoLand:不只是 Go IDE并配置好环境
Go语言基础语法
变量
常见的变量类型有字符串,整数,浮点型,布尔型
整型分为以下两个大类:
按长度分为:int8、int16、int32、int64对应的无符号整型:uint8、uint16、uint32、uint64
其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
Go语言支持两种浮点型数:float32和float64。
布尔型数据只有true(真)和false(假)两个值。
go语言的声明方式有
var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)
常见的表示有
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
const s string = "constant"
const h = 50000000
if else语法
• 可省略条件表达式括号。
• 持初始化语句,可定义代码块局部变量。
• 代码块左 括号必须在条件表达式尾部。
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
}
实例
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
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语言中循环只有唯一的for循环,如果for后面什么都不写就代表是死循环 可以使用break跳出循环或者continue继续循环
switch分枝结构
与c或c++类似,同样的在switch后面的变量名不需要括号,与c不同的是,在go里面 switch中的case不需要加break,它会自动退出,若想跳到下一个case,可以使用fallthrough关键字,此外,Switch后还可以不跟语句,直接在case进行判断
代码示例
switch {
case 1:
fmt.Println("one")
case 2:
fmt.Println(""two)
case 3:
fmt.Println(""three)
default:
fmt.Println("other")
}
数组
数组的定义:var a [len]int,比如:var a [5] int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。
数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
支持 "=="、"!=" 操作符,因为内存总是被初始化过的。
指针数组 [n]*T,数组指针 *[n]T。
切片
通过make来创建切片
var slice []type = make([]type, len)
slice := make([]type, len)
slice := make([]type, len, cap)
用append内置函数操作切片(切片追加)
切片的一些操作
示例
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Printf(a, b, c, d, e, f)
fmt.Println(g)
const s string = "constant"
const h = 50000000
const i = 3e20 / h
fmt.Printf(s, h, i, math.Sin(h), math.Sin(i))
}
map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 Go语言中 map的定义语法如下 map[KeyType]ValueType 其中, KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为: make(map[KeyType]ValueType, [cap]) 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量 代码示例
m: :=make(map[string]int)
m["one"]=1
m["two"]=2
fmt.Println(m) //map[one:1 wor:2]
fmt.println(len(m)) //2
fmt.Println(m["one"]) //1
map遍历
遍历map时的元素顺序与添加键值对的顺序无关。
for k, v := range acount {
fmt.Println(k, v)
range
对于slice或者map,我们可以用range来快速遍历,这样代码能更简洁,range遍历时会返回两个值,第一个是索引,第二个是值,若我们不需要索引的话,可以用下划线忽略
for k,v := range m{
fmt.Println(k,v)
}
函数
函数特点
- 无需声明原型。
- 支持不定变参。
- 支持多返回值。
- 支持命名返回参数。
- 支持匿名函数和闭包。
- 函数也是一种类型,一个函数可以赋值给变量。
- 不支持 嵌套(一个包不能有两个名字一样的函数)重载,默认参数
函数是第一类对象,可作为参数传递。建议将复杂签名定义为函数类型,以便于阅读。
func add(a int,b int) int{
return a+b
}
指针
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。
结构体
使用type和struct关键字来定义结构体,具体代码格式如下: type 类型名 struct { 字段名 字段类型 字段名 字段类型 … }
其中:
- 类型名:标识自定义结构体的名称,在同一个包内不能重复。
- 字段名:表示结构体字段名。结构体中的字段名必须唯一。
- 字段类型:表示结构体字段的具体类型。
字符串操作和格式化
- len(str) 求长度
- +或fmt.Sprintf 拼接字符串
- strings.Split 分割
- strings.Contains 判断是否包含
- strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
- strings.Index(),strings.LastIndex() 子串出现的位置
- strings.Join(a[]string, sep string) join操作
格式化样式:字符串形式,格式化符号以 % 开头, %s 字符串格式,%d 十进制的整数格式。Go 字符串格式化符号:
JSON 处理
使用 encoding/json 包来处理 JSON。
虽然将 JSON 数据存储到空接口类型的值中可以用来解析任意结构的 JSON 数据,但是在实际应用中发现还是有不可控的地方,比如将数字字符串的值转换成了 float 类型的值,所以经常会在运行时报类型断言的错误,所以在 JSON 结构确定的情况下还是优先使用结构体类型声明,将 JSON 数据到结构体中的方式来解析 JSON。
下面是一个简单的示例,解析 JSON 字符串并访问其中的字段:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonStr := `{"name": "Alice", "age": 25}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
}
时间处理
Go 中的 time 包提供了处理时间和日期的功能。time.Now()使用本地时间,time.Local即本地时区,取决于运行的系统环境配置,优先取”TZ”这个环境变量,然后取/etc/localtime,都取不到就用UTC兜底。
以下是一个示例,将时间格式化为指定的字符串:
func main() {
currentTime := time.Now()
formattedTime := currentTime.Format("2006-01-02 15:04:05")
fmt.Println("Formatted time:", formattedTime)
}
数字解析
使用 strconv 包中的函数来解析字符串为数字。我们可以用 parselnt 或者 parseFloat 来解析一个字符串。 parseint 参数我们可以用 Atoi 把一个十进制字符串转成数字。可以用 itoA 把数字转成字符串。如果输入不合法,那么这些函数都会返回error
以下是一个示例,将字符串解析为整数和浮点数:
import (
"fmt"
"strconv"
)
func main() {
intStr := "42"
intNum, err := strconv.Atoi(intStr)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Parsed integer:", intNum)
floatStr := "3.14"
floatNum, err := strconv.ParseFloat(floatStr, 64)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Parsed float:", floatNum)
}