一、什么是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 语言的标准库 strings 和 strconv 提供了丰富的字符串操作方法,并且性能也非常优秀。
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.进程信息
可以使用 os 和 os/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.多参与社区和讨论