Go 语言入门指南:基础语法和常用特性解析

2023年 7月 26日 52.7k 0

Go语言的特点

  • 简单易学:
    Go语言的语法简洁清晰,与C语言风格相似,易于学习和掌握。

  • 高性能、并发编程:
    Go语言原生支持并发编程,采用了轻量级的Goroutine并发模型和Channel通信机制,使得编写并发程序变得更加简单和高效。Go语言具备良好的性能,它的编译器将Go代码编译为机器码,且在运行时使用垃圾回收机制来管理内存,有效地提高了程序的执行效率。

  • 完善的工具链:
    Go语言内置了丰富的工具集,包括格式化工具、测试工具、性能分析工具等,开发者可以方便地进行代码格式化、单元测试和性能借助于这些标准库,开发者可以更快地构建出高效、可靠和安全的应用程序。此外,Go语言社区也提供了丰富的第三方包,可供开发者使用和扩展。优化等操作。

  • 丰富的标准库:
    Go语言的标准库是它的一个重要特点,它提供了许多功能丰富和易于使用的包,涵盖了各个领域。借助于这些标准库,开发者可以更快地构建出高效、可靠和安全的应用程序。此外,Go语言社区也提供了丰富的第三方包,可供开发者使用和扩展。

  • 跨平台支持:Go语言支持多种主流操作系统和硬件架构,可以编译生成可执行文件,无需依赖其他库或运行环境,便于在不同平台上部署和运行。

  • 垃圾回收:Go语言通过垃圾回收机制自动管理内存,避免了常见的内存错误,如内存泄漏和野指针,提高了程序的安全性和稳定性。

  • 静态链接:Go语言是一种静态类型语言,编译器会在编译阶段进行类型检查,可以提早发现潜在的类型错误,减少运行时的错误。

  • 快速编译:Go语言具有快速的编译速度,这是由于Go编译器的设计和优化带来的。

  • Go语言的基础语法

    HelloWorld

    package main  //表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包,一定包含一个main包
      
    import (
        "fmt"
    )
      
    func main() {  
        fmt.Println("hello world")  
    }
    

    package main表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包,一定包含一个main

    import关键字用于导入其他包(packages)的代码。导入语句通常放置在Go源文件的开头。需要导入多个包,将它们放在圆括号中并用换行符分隔。

    fmt是Go语言标准库中的一个包,提供了格式化输入输出的功能。它包含了一系列的函数,可以用来打印文本、格式化字符串、读取输入等。

    常用的fmt函数和方法如下:

    • fmt.Print:打印输出内容,不会在文本末尾添加换行符。
    • fmt.Println:打印输出内容,并在文本末尾添加换行符。
    • fmt.Printf:格式化打印输出内容,可以使用占位符来指定输出格式。
    • fmt.Sprint:将给定的参数格式化为字符串并返回该字符串,不会进行打印输出。
    • fmt.Sprintf:将给定的参数格式化为字符串并返回该字符串,可以使用占位符来指定输出格式。
    • fmt.Scan:从标准输入中读取一个值并使用指定的格式将其存储到传入的变量中。
    • fmt.Scanln:从标准输入中读取一行文本,并尝试将其解析为参数列表中变量的值。

    变量

    var + 变量名 + 变量类型 (在Go语言中变量类型在变量名后面)

    使用步骤 :
    1. 变量的声明
    2. 变量的赋值
    3. 变量的使用

    package main  
      
    import (  
    "fmt"  
    )  
      
    func main() {  
    // 变量的声明  
    var A int  
    // 变量的赋值  
    A = 18  
    // 变量的使用  
    fmt.Println("A = ", A)  
    }
    
    // var 可以自己判断变量类型
    var B = 18
    
    // 省略var 用:=
    C := "Hello World"
    

    每个类型有默认值,如果不对变量进行赋值,变量的值为默认值

    数据类型

    在Go语言中,有几种基本的数据类型可以用来存储不同种类的数据。下面是常见的基本数据类型:

  • 整数类型(int):用于表示整数值,包括有符号和无符号的整数类型。例如:intint8int16int32int64uintuint8uint16uint32uint64等。
  • 浮点数类型(float):用于表示小数值,有两种精度的浮点数类型:float32float64
  • 布尔类型(bool):用于表示逻辑值,只有两个取值:truefalse
  • 字符串类型(string):用于表示文本,使用双引号或反引号将文本括起来。例如:“Hello, Go!”。
  • 字符类型:用于表示单个字符,使用单引号将字符括起来。例如:‘A’。
  • 指针类型:用于存储变量的内存地址,指向变量所在的内存空间。
  • 数组类型:用于存储固定长度的相同类型元素的集合。
  • 切片类型:用于存储可变长度的相同类型元素的序列。
  • 映射类型:用于存储键值对集合,类似于字典。
  • 结构体类型:用于定义自定义的复合数据类型,可以包含不同类型的字段。
  • 指针类型

    //声明
    var 指针变量名 *数据类型
    
    //赋值
    指针变量名 = & 变量名
    
    //通过指针改变变量值 
    *指针变量名 = 新值
    
    

    指针变量名是你给指针变量起的名字

    数据类型是指针所指向变量的数据类型。指针变量名前面的*表示该变量是一个指针变量。

    指针在Go语言中常用于以下情况:

    • 传递大的数据结构,避免复制整个数据结构造成性能损失;
    • 通过指针修改实际参数的值;
    • 动态分配内存。

    需要注意的是,在使用指针之前,需要先确保指针不为 nil(空指针),否则会引发运行时错误。

    分支结构 (if语句 、switch语句)

    1.单分支 if

    if 条件表达式 {
        逻辑代码
    }
    

    2.双分支 if-else

    if 条件表达式 {
        逻辑代码
    }
    else{
        逻辑代码
    }
    
  • 多分支_if
  • if 条件表达式 {
        逻辑代码
    }
    else if 条件表达式 {
        逻辑代码
    }
    ......
    else{
        逻辑代码
    }
    

    4 switch语句

    switch 表达式 {
        case 值1,值2, ...:
            语句块1 
        case 值1,值2, ...:
            语句块2 
           ....
        default:
    }
    

    循环结构 for循环

  • 基本的for循环:在循环开始之前初始化一个计数器,然后在每次循环迭代之后更新计数器,直到计数器达到预定的值。

    for 初始化; 条件; 更新 { 
        // 循环执行的代码块
    }
    

    **

    例如,下面的代码会打印从0到4的整数:

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

    **

  • 省略初始化和更新:如果不需要初始化和更新步骤,可以省略它们。

    for 条件 {
        // 循环执行的代码块
    }
    

    **

    例如,下面的代码会不断地打印当前的秒数,直到到达10秒:

    for time.Now().Second() < 10 {
        fmt.Println(time.Now().Second())
    }
    

    **

  • 无限循环:如果条件部分被省略,则会无限循环执行代码块,除非使用 break 或 return 语句终止循环。

    for {
        // 循环执行的代码块
    }
    
  • for range

    在Go语言中,for range 是一种特殊的 for 循环形式,用于遍历数组、切片、字符串、映射和通道等数据结构。

    for range 的语法如下:

    for 索引, 值 := range 表达式 {
        // 循环执行的代码块
    }
    

    **

    其中,

    • 索引 是当前元素的索引或键,
    •  是当前元素的值,
    • 表达式 是要迭代的数据结构。

    使用 for range 循环可以方便地获取每个元素的索引和值,适用于遍历整个数据结构。在每次迭代中,索引 和  会被重新赋值为下一个元素的索引和值,直到遍历完整个数据结构。

    以下是一些示例:

  • 遍历数组或切片:

    numbers := []int{1, 2, 3, 4, 5}
    for index, value := range numbers {
        fmt.Println(index, value)
    }
    

    **

    这个示例会输出数组/切片中每个元素的索引和值。

  • 遍历字符串:

    text := "Hello, Go!"
    for index, value := range text {
        fmt.Println(index, value)
    }
    

    **

    这个示例会输出字符串中每个字符的索引和对应的Unicode码点值。

  • 遍历映射:

    person := map[string]interface{}{
        "name":   "Alice",
        "age":    25,
        "gender": "female",
    }
    for key, value := range person {
        fmt.Println(key, value)
    }
    

    **

    这个示例会输出映射中每个键值对的键和值。

  • 遍历通道:

    data := make(chan int)
    go func() {
    data

  • 相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论