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

Go语言的特点

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

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

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

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

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

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

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

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

Go语言的基础语法

HelloWorld

go 复制代码
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. 变量的使用

go 复制代码
package main  
  
import (  
"fmt"  
)  
  
func main() {  
// 变量的声明  
var A int  
// 变量的赋值  
A = 18  
// 变量的使用  
fmt.Println("A = ", A)  
}

// var 可以自己判断变量类型
var B = 18

// 省略var 用:=
C := "Hello World"

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

数据类型

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

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

指针类型

csharp 复制代码
//声明
var 指针变量名 *数据类型

//赋值
指针变量名 = & 变量名

//通过指针改变变量值 
*指针变量名 = 新值

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

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

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

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

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

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

1.单分支 if

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

2.双分支 if-else

arduino 复制代码
if 条件表达式 {
    逻辑代码
}
else{
    逻辑代码
}
  1. 多分支_if
arduino 复制代码
if 条件表达式 {
    逻辑代码
}
else if 条件表达式 {
    逻辑代码
}
......
else{
    逻辑代码
}

4 switch语句

arduino 复制代码
switch 表达式 {
    case 值1,值2, ...:
        语句块1 
    case 值1,值2, ...:
        语句块2 
       ....
    default:
}

循环结构 for循环

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

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

    **

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

    css 复制代码
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }

    **

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

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

    **

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

    scss 复制代码
    for time.Now().Second() < 10 {
        fmt.Println(time.Now().Second())
    }

    **

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

    arduino 复制代码
    for {
        // 循环执行的代码块
    }

for range

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

for range 的语法如下:

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

**

其中,

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

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

以下是一些示例:

  1. 遍历数组或切片:

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

    **

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

  2. 遍历字符串:

    go 复制代码
    text := "Hello, Go!"
    for index, value := range text {
        fmt.Println(index, value)
    }

    **

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

  3. 遍历映射:

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

    **

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

  4. 遍历通道:

    go 复制代码
    data := make(chan int)
    go func() {
        data <- 1
        data <- 2
        close(data)
    }()
    for value := range data {
        fmt.Println(value)
    }

    **

    这个示例会从通道中依次接收值,并打印出来。

需要注意的是,对于字符串和映射,索引 实际上是每个元素的键或键的字节索引。

for range 循环使用得非常广泛,特别是在需要迭代遍历数据结构的情况下。

函数

提高代码的复用性和维护性,减少代码冗余

go 复制代码
//函数的声明
 func 函数名 (形参列表)(返回值类型列表){
    执行语句
    return + 返回值列表 
}
//函数的调用
函数名 + (形参1,形参2,...)

注意

函数名 首字母大写,可以在本包文件和其它包文件访问(类似public)

函数名 首字母小写,只能被本包文件访问(类似private)

Go语言函数可以有多个返回值

Go语言函数是一种数据类型赋值给变量,也可以当成其它函数是形参和返回

Go语言中函数不支持重载 ,但支持可变参数

scss 复制代码
package main

// 定义一个函数,函数参数为: 可变参数名 + ... + 参数类型 
func test (num...int){
    //函数内部将可变参数当作切片处理
}

func main(){
    test()
    test(1)
    test(2,28,30)
    test(2,...,100)
}
相关推荐
CallBack8 个月前
Typora+PicGo+阿里云OSS搭建个人图床,纵享丝滑!
前端·青训营笔记
Taonce1 年前
站在Android开发者的角度认识MQTT - 源码篇
android·青训营笔记
AB_IN1 年前
打开抖音会发生什么 | 青训营
青训营笔记
monster1231 年前
结营感受(go) | 青训营
青训营笔记
翼同学1 年前
实践记录:使用Bcrypt进行密码安全性保护和验证 | 青训营
青训营笔记
hu1hu_1 年前
Git 的正确使用姿势与最佳实践(1) | 青训营
青训营笔记
星曈1 年前
详解前端框架中的设计模式 | 青训营
青训营笔记
tuxiaobei1 年前
文件上传漏洞 Upload-lab 实践(中)| 青训营
青训营笔记
yibao1 年前
高质量编程与性能调优实战 | 青训营
青训营笔记
小金先生SG1 年前
阿里云对象存储OSS使用| 青训营
青训营笔记