GO语言基础语法 | 青训营笔记

69 阅读6分钟

一、什么是go语言

1.高性能、高并发

  • Goroutine: Go语言使用goroutine来实现并发。goroutine是一个轻量级的线程,可以轻松地创建数千个goroutine来并发处理任务。相比传统的线程,创建、销毁和上下文切换的开销都非常小,因此可以更加高效地实现异步处理和并发编程。

  • Channel: Go语言通过channel来实现goroutine之间的通讯和同步。channel是一种通讯机制,它可以实现多个goroutine之间的数据交换,保证了数据的同步和可靠性,避免了多个goroutine同时修改共享变量导致的竞态条件和死锁问题。

  • 内存管理:Go语言使用自动垃圾回收(garbage collection)来释放无用的内存,程序员无须手动管理内存。Go语言的内存管理策略非常高效,可以在保证运行时系统性能的同时,避免了一些常见的内存泄露问题。

  • 编译器优化:Go语言的编译器可以进行函数内联、内存分配优化和逃逸分析等多种优化,可以使得程序的性能得到进一步的提升。

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

3.丰富的标准库 

4.完善的工具链 

5.静态链接 

静态链接是将所有的目标文件(包括库文件)合并成一个可执行文件的过程,使得程序在运行时无需依赖外部库。

6.快速编译 

7.跨平台 

  • 确定所需支持的操作系统和体系结构(如Windows、Linux、macOS等)以及版本号;
  • 编写可适用于这些操作系统和体系结构的Go语言程序代码,并确保在一个操作系统上可构建和运行成功;
  • 在终端上使用 go build 命令构建需要的平台和体系结构的二进制文件。

8.垃圾回收

Go语言采用了自动垃圾回收机制,即开发者不需要手动管理内存。Go语言中的垃圾收集器会定期扫描堆上的对象,标记并清除那些不再使用的对象,从而释放内存空间。因为垃圾回收机制是自动进行的,所以开发者可以更加专注于业务逻辑的实现,而不用过多地关注内存管理等问题。此外,Go语言的垃圾回收机制基于动态创建的堆和栈,能够最大可能地避免内存泄露等问题。

二、go基本语法

1.变量

在Go语言中定义变量的语法为var 变量名 类型。变量名可以使用字母、数字和下划线组成,但不能以数字开头。Go语言的类型声明可以使用显式或隐式的方式。

2.函数

在Go语言中,函数的定义格式为:func 函数名(参数列表) 返回值列表 { 函数体 }。其中,参数列表和返回值列表都是可选的,函数体是必需的。

3.指针

Go语言支持指针,指针类型的变量存储了一个内存地址。通过指针可以直接访问变量的内存空间,从而可以在函数调用时传递大的数据结构,或者在函数中修改变量的值。

在Go语言中,使用&操作符来获取变量的地址,使用*操作符来访问指针所指向的变量。下面是一个例子:

package main

import "fmt"

func main() {
    // 声明一个int类型的变量
    var num int = 10 

    // 声明一个指向int类型变量的指针
    var ptr *int = &num 

    // 打印变量num和指针ptr所指向的变量的值
    fmt.Println("num:", num) // 输出: num: 10
    fmt.Println("ptr:", *ptr) // 输出: ptr: 10

    // 修改变量num的值
    num = 20 

    // 打印变量num和指针ptr所指向的变量的值
    fmt.Println("num:", num) // 输出: num: 20
    fmt.Println("ptr:", *ptr) // 输出: ptr: 20
}

4.结构体

结构体是一种自定义数据类型,可以封装多个不同类型的成员变量,以及针对这些成员变量的方法。使用结构体可以方便地组织和管理复杂的数据结构。

5.错误处理

在 Go 中,错误处理和其他语言中的异常处理有所不同。Go 语言的错误处理是通过返回值来完成的,而不是通过抛出异常和捕获异常来实现的。

在函数发生错误时,通常会返回一个非空的 error 对象。如果没有发生错误,则返回 nil

6.字符串操作

在 Go 语言中,字符串是一个被双引号包含的字符序列,支持加法运算和下标访问。同时,Go 语言的标准库 stringsstrconv 提供了丰富的字符串操作方法,并且性能也非常优秀。

package main

import (
    "fmt"
    "strings"
    "strconv"
)

func main() {
    // 判断字符串是否包含另一个字符串
    fmt.Println(strings.Contains("hello world", "world")) // 输出: true

    // 统计字符串中某个字母出现的次数
    fmt.Println(strings.Count("hello world", "o")) // 输出: 2

    // 检查字符串是否以指定字符串为前缀或后缀
    fmt.Println(strings.HasPrefix("hello world", "hello")) // 输出: true
    fmt.Println(strings.HasSuffix("hello world", "world")) // 输出: true

    // 将字符串替换为指定的字符串
    fmt.Println(strings.Replace("hello world", "world", "golang", -1)) // 输出: hello golang

    // 将字符串按照指定分隔符进行分割
    s := "apple,orange,banana"
    fmt.Println(strings.Split(s, ",")) // 输出: [apple orange banana]

    // 将字符串进行大小写转换
    fmt.Println(strings.ToUpper("hello world")) // 输出: HELLO WORLD
    fmt.Println(strings.ToLower("HELLO WORLD")) // 输出: hello world

    // 将字符串转换为整型或浮点型
    num, err := strconv.Atoi("123")
    if err == nil {
        fmt.Printf("num=%d\n", num) // 输出: num=123
    }

    f, _ := strconv.ParseFloat("3.14", 64)
    fmt.Printf("f=%.2f\n", f) // 输出: f=3.14

7.时间处理

时间相关的操作都集中在 time 包中。标准库提供了诸如获取当前时间、格式化时间和时间间隔计算等常用方法

8.数字解析

可以使用 strconv 包提供的方法将字符串解析为整型或浮点型类型

9.进程信息

可以使用 osos/exec 包获取当前进程的相关信息,例如进程 ID、环境变量

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    // 获取进程 ID
    fmt.Printf("PID: %d\n", os.Getpid())

    // 获取环境变量
    fmt.Println(os.Getenv("PATH"))

    // 执行系统命令
    cmd := exec.Command("ls")
    output, _ := cmd.Output()
    fmt.Printf("%s", output)
}

三、总结

作为一个初学go语言的学生,从以下几个方面进行下一步学习

1.多看文档和参考资料

2.坚持实践和练习

3.善于利用Go标准库

4.注意代码风格和规范

5.多参与社区和讨论