Go语言基础语法 | 豆包MarsCode AI刷题

52 阅读4分钟

Co语言语法基础

  1. 高性能、高并发

  2. 语法简单、学习曲线平缓

  3. 丰富的标准库

  4. 完善的工具链

  5. 静态链接

  6. 快速编译

  7. 跨平台

  8. 垃圾回收

package main
import (
	"net/http"
)
func main() {
    http.Handle("/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":8080", nil)
}

Go语言属于强类型语言

switch语法中的每个case语句后不用添加break语句,一旦匹配自动跳出结构

switch可以使用任何的变量类型,如字符串和结构体,甚至可以用来取代任意的if-else语句

案例

package main

import (

​    "fmt""time"

)

func main() {

​    a := 2switch 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")

​    }

​    t := time.Now()

​    switch {

​    case t.Hour() < 12:

​        fmt.Println("It's before noon")

​    default:

​        fmt.Println("It's after noon")

​    }

}

相较于数组,Go语言开发中使用切片的次数更多

切片是一个可变长度的数组,可以任意更改长度,使用make()创建一个切片,make 函数用于创建切片、映射(map)和通道(channel)

切片是 Go 语言中一种非常灵活和强大的数据结构,它允许你动态地添加、删除和访问元素。切片的底层是一个数组,但它提供了更高级的功能和便利性。

在 Go 语言中,append 函数用于向切片的末尾添加一个或多个元素。append 函数的第一个参数是要操作的切片 s,第二个参数是要添加的元素 "d"append 函数会返回一个新的切片,这个新切片包含了原来的切片 s 的所有元素以及新添加的元素 "d"。需要注意的是,如果原来的切片 s 的底层数组没有足够的容量来容纳新的元素,append 函数会自动创建一个新的底层数组,并将原来的数组内容复制到新的数组中,然后再添加新的元素。

copy(c, s) 是 Go 语言中的一个内置函数,用于将一个切片(slice)的元素复制到另一个切片中。在这个例子中,它的作用是将切片 s 中的元素复制到切片 c 中。

具体来说,copy(c, s) 会从切片 s 的第一个元素开始,逐个复制到切片 c 中,直到填满切片 c 或者切片 s 中的元素全部被复制完毕。如果切片 c 的长度小于切片 s 的长度,那么只有切片 c 长度的元素会被复制;如果切片 c 的长度大于切片 s 的长度,那么切片 s 中的所有元素都会被复制,而切片 c 中剩余的位置将保持其原始值(零值)。

package main

import "fmt"

func main() {

​    s := make([]string, 3)

​    s[0] = "a"

​    s[1] = "b"

​    s[2] = "c"

​    fmt.Println("get:", s[2])

​    fmt.Println("len:", len(s))

​    s = append(s, "d")

​    s = append(s, "e", "f")

​    fmt.Println(s)

​    c := make([]string, len(s))

​    copy(c, s)

​    fmt.Println(c)

​    fmt.Println(s[2:5])

​    fmt.Println(s[:5])

​    fmt.Println(s[2:])

​    good := []string{"g", "o", "o", "d"}

​    fmt.Println(good)

}

答案: get: c len: 3 [a b c d e f] [a b c d e f] [c d e] [a b c d e] [c d e f] [g o o d]

创建map

m := make(map[string]int)

string 是键的数据类型, int是值的数据类型

m["one"] = 1

使用上面的语句可以向map集合中赋值

Go语言的map集合中元素是无序的

r, ok := m["unknown"]
​
fmt.Println(r, ok)

定义一个结构体

type user struct {
​
•    name string
​
•    password string
​
}
if err != nil {
​
•    panic(err)
​
}

这段代码是一个错误处理的代码片段,它的作用是在程序发生错误时,通过调用 panic 函数来抛出一个异常,从而导致程序崩溃。这种方式通常用于处理不可恢复的错误,例如无法连接到数据库、文件系统错误等。

在这个特定的代码片段中,err 是一个错误对象,如果它的值不是 nil,则表示发生了错误。panic 函数会接受一个任意类型的值作为参数,并将其作为错误信息输出,然后程序会停止执行。

这种错误处理方式的优点是简单直接,可以快速定位问题。但是,它也有缺点,因为它会导致程序崩溃,这在某些情况下可能不是我们想要的。例如,如果程序是一个服务器程序,我们可能希望它能够在遇到错误时记录错误日志并继续运行,而不是崩溃。

因此,在实际的编程中,我们应该根据具体情况选择合适的错误处理方式。如果错误是可以恢复的,我们应该尝试恢复并继续执行;如果错误是不可恢复的,我们可以选择记录错误日志并优雅地停止程序。

5.1.png 协程:用户态,轻量级线程,栈KB级别 线程:内核态,线程跑多个协程,栈MB级别

通过go关键字来开启一个协程

5.2.png go语言提倡通过通信共享内存

make(chan 元素类型,[缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int, 2)

5.3.png 无缓冲通道是同步的