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
、int8
、int16
、int32
、int64
、uint
、uint8
、uint16
、uint32
、uint64
等。float32
和float64
。true
和false
。指针类型
//声明
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