Go语言基础语法|青训营

79 阅读6分钟

(学习go语言第一天的一点总结)

Go语言基础语法

Go语言是一种现代化、高效的编程语言,由Google开发。它具有简洁的语法和强大的并发支持,适用于构建高性能的网络服务和分布式系统。本文将介绍Go语言的基础语法,包括变量、函数、流程控制和数据类型等。

变量

在Go语言中,变量的声明和赋值可以分开进行,也可以一起进行。以下是一些变量声明和赋值的示例:

  1. var name string
  2. name = "John"
  3. var age int = 25
  4. city := "New York"
  5. var a, b, c = 1, 2, 3
  6. var (
  7. q = 1
  8. w = 2
  9. )

注意当个变量省略var时不能用“=”号。

函数

Go语言中的函数使用func关键字进行声明。以下是一个简单的函数示例:

func add(a, b int) int {
    return a + b
}

在上面的示例中,我们定义了一个名为add的函数,它接受两个整数参数ab,并返回它们的和。

流程控制

Go语言提供了常见的流程控制语句,例如条件语句和循环语句。以下是一些示例:

条件语句

  1. if age >= 18 {
  2. fmt.Println("成年人")
  3. } else if age >= 13 {
  4. fmt.Println("青少年")
  5. } else {
  6. fmt.Println("儿童")
  7. }

在上面的示例中,我们使用if语句根据年龄的不同输出不同的消息。

循环语句

  1. for i := 0; i < 5; i++ {
  2. fmt.Println(i)
  3. }

在上面的示例中,我们使用for循环打印出0到4的数字。

数据类型

Go语言具有丰富的数据类型,包括基本类型(如整数、浮点数、布尔值和字符串)以及复合类型(如数组、切片、映射和结构体)。以下是一些示例:

  1. var age int = 25
  2. var price float64 = 19.99
  3. var isStudent bool = true
  4. var name string = "John"
  5. var numbers [5]int
  6. numbers[0] = 1
  7. numbers[1] = 2
  8. var scores []int
  9. scores = append(scores, 90)
  10. scores = append(scores, 85)
  11. var person = map[string]string{"name": "John", "city": "New York"}
  12. type User struct {
  13. name string
  14. age int
  15. }

在上面的示例中,我们声明了不同类型的变量,包括整数、浮点数、布尔值和字符串。我们还声明了一个整数数组和一个整数切片,并向它们添加了元素。我们还声明了一个字符串映射,并初始化了一个结构体类型。(go语言有自动类型判断功能)

语法注意事项

(1)每行代码不用“;”隔开(go语言自动会加上去),但放在同一行就需要了

(2)Go语言是大小写敏感的,因此变量名和函数名的大小写要一致。

(3)main函数为执行入口。

(4)在使用if语句、for循环和switch语句时,代码块的左括号"{"必须和关键字放在同一行,否则会报错。

(5)在函数的返回值列表中,如果多个返回值的类型相同,可以将类型写在最后一个返回值的后面,例如func fundemo(a, b float64) float64。

以下是对一些常用包的分析

encoding/json

encoding/json是Go语言中用于JSON编码和解码的包。它提供了将Go数据结构转换为JSON格式的函数,以及将JSON数据转换为Go数据结构的函数。以下是一些encoding/json包的基本使用示例:

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type Person struct {
  7. Name string `json:"name"`
  8. Age int `json:"age"`
  9. }
  10. func main() {
  11. //Go数据结构转换为JSON格式
  12. p := Person{Name: "John", Age: 25}
  13. jsonData, err := json.Marshal(p)
  14. if err != nil {
  15. fmt.Println("JSON encoding error:", err)
  16. return
  17. }
  18. fmt.Println(string(jsonData))
  19. // 将JSON数据转换为Go数据结构
  20. jsonData = []byte(`{"name":"Alice","age":30}`)
  21. var p2 Person
  22. err = json.Unmarshal(jsonData, &p2)
  23. if err != nil {
  24. fmt.Println("JSON decoding error:", err)
  25. return
  26. }
  27. fmt.Println(p2.Name, p2.Age)
  28. }

在上面的示例中,我们定义了一个名为Person的结构体类型,并使用json标签指定了JSON字段的名称。我们将Person类型的实例转换为JSON格式并打印出来,然后将JSON数据转换为Person类型的实例并打印出来。

os

os包提供了与操作系统交互的函数和方法,例如文件操作、环境变量和命令行参数等。以下是一些os包的基本使用示例:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. // 获取命令行参数
  8. args := os.Args
  9. fmt.Println(args)
  10. // 获取环境变量
  11. env := os.Getenv("PATH")
  12. fmt.Println(env)
  13. // 创建目录
  14. err := os.Mkdir("test", 0755)
  15. if err != nil {
  16. fmt.Println("Directory creation error:", err)
  17. return
  18. }
  19. // 创建文件
  20. file, err := os.Create("test.txt")
  21. if err != nil {
  22. fmt.Println("File creation error:", err)
  23. return
  24. }
  25. defer file.Close()
  26. // 写入文件
  27. _, err = file.WriteString("Hello, World!")
  28. if err != nil {
  29. fmt.Println("File writing error:", err)
  30. return
  31. }
  32. }

在上面的示例中,我们使用os.Args获取命令行参数,并使用os.Getenv获取环境变量。我们还使用os.Mkdir创建一个目录,并使用os.Create创建一个文件。然后,我们使用file.WriteString向文件中写入内容。

math

math包提供了数学函数和常量,例如三角函数、指数函数和对数函数等。以下是一些math包的基本使用示例:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func main() {
  7. // 计算平方根
  8. fmt.Println(math.Sqrt(16))
  9. // 计算正弦值
  10. fmt.Println(math.Sin(math.Pi / 2))
  11. // 计算自然对数
  12. fmt.Println(math.Log(math.E))
  13. // 计算底数为2的对数
  14. fmt.Println(math.Log2(8))
  15. // 计算以10为底的对数
  16. fmt.Println(math.Log10(100))
  17. }

在上面的示例中,我们使用math.Sqrt计算平方根,使用math.Sin计算正弦值,使用math.Log计算自然对数,使用math.Log2计算以2为底的对数,使用math.Log10计算以10为底的对数。

string

string是Go语言中表示字符串的类型。string类型是不可变的,即一旦创建就不能修改。以下是一些string类型的基本使用示例:

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func main() {
  7. // 字符串拼接
  8. str1 := "Hello"
  9. str2 := "World"
  10. result := str1 + " " + str2
  11. fmt.Println(result)
  12. // 字符串长度
  13. fmt.Println(len(result))
  14. // 字符串切割
  15. parts := strings.Split(result, " ")
  16. fmt.Println(parts)
  17. // 字符串替换
  18. newStr := strings.Replace(result, "World", "Go", 1)
  19. fmt.Println(newStr)
  20. // 字符串包含
  21. fmt.Println(strings.Contains(result, "Hello"))
  22. }

输出:

Hello World

11

[Hello World]

Hello Go

在上面的示例中,我们使用+运算符将两个字符串拼接在一起,并使用len函数获取字符串的长度。我们使用strings.Split函数将字符串切割成多个部分,并使用strings.Replace函数替换字符串中的部分内容。最后,我们使用strings.Contains函数判断字符串是否包含某个子串。

errors

errors包提供了处理错误的函数和类型。它定义了一个error接口,用于表示错误。以下是一些errors包的基本使用示例:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. func divide(a, b float64) (float64, error) {
  7. if b == 0 {
  8. return 0, errors.New("division by zero")
  9. }
  10. return a / b, nil
  11. }
  12. func main() {
  13. result, err := divide(10, 2)
  14. if err != nil {
  15. fmt.Println("Error:", err)
  16. return
  17. }
  18. fmt.Println(result)
  19. result, err = divide(10, 0)
  20. if err != nil {
  21. fmt.Println("Error:", err)
  22. return
  23. }
  24. fmt.Println(result)
  25. }

在上面的示例中,我们定义了一个divide函数,用于计算两个浮点数的商。如果除数为0,则返回一个error类型的值,表示除零错误(error(*errors.errorString) *{s: "division by zero"})。在main函数中,我们调用divide函数并检查返回的错误。如果错误不为空,则打印错误信息。

今天用go的遇到的错误(用的vscode):

(1)go: cannot find main module; see 'go help modules'

原因:没有go.mod文件

(2)Build Error: go build -o d:\programme\GO\workspace\demo\__debug_bin3251768621.exe -gcflags all=-N -l . main.go:1:1: illegal character U+200B (exit status 1)

原因:有不明符号,可能是复制粘贴别人的代码出错了(我当时重新打一遍就好了)。

(3)missing return at end of function

原因:表示函数没有返回值,但是在函数的定义中声明了返回值