Go语言基础|青训营

126 阅读7分钟

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内置函数操作切片(切片追加)

切片的一些操作

dae956d71aa94454557761182c35b1f9.png 示例

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语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。

image.png

结构体

使用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 字符串格式化符号:

image.png

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)
}