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

94 阅读6分钟

引言

go语言是Google开发的开源编程语言,诞生于2006年1月2日,于2009年11月开源,2012年发布go稳定版。go语言在多核并发上拥有原生的设计优势,go语言从底层原生支持并发,无需第三方库、开发者的编程技巧和开发经验。

go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”。很多公司,特别是中国的互联网公司,即将或者已经完成了使用 go 语言改造旧系统的过程。经过 go 语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现。

基础语法

1. 语法结构

go语言的代码由包(package)、导入(import)和函数(function)组成。每个go程序至少包含一个main包和一个main函数作为入口。

2. 变量和常量

go语言使用关键字var声明变量,同时可以指定变量类型也可以使用类型推导。常量使用关键字const进行声明。例如:

var x int
x = 10

const pi = 3.14

3. 数据类型

go语言提供了基本的数据类型,如整型、浮点型、布尔型等,同时也支持复合类型,如数组、切片、映射等。还有字符串和指针等常用数据类型。

4. 函数

函数是go语言中的基本执行单元,通过关键字func定义。函数可以有参数和返回值,也支持多个返回值。示例:

func add(a, b int) int {
    return a + b
}

sum := add(2, 3)

5. 流程控制

go语言提供了条件语句if和switch,以及循环语句for和range来实现流程控制。可以使用break、continue和goto来控制循环或跳转。

6. 数组和切片

数组是一种固定长度的数据结构,而切片是对数组的抽象,可以动态增长。切片通过make函数创建,可以使用下标访问元素。还可以使用内置函数append()向切片中添加元素。

arr := [3]int{1, 2, 3}
slice := arr[1:3]

slice = append(slice, 4)

7. 结构体

结构体是一种自定义的复合数据类型,可以包含不同类型的字段。通过点操作符访问字段,还可以定义方法和接口。示例:

type Person struct {
    Name string
    Age  int
}

func (p Person) sayHello() {
    fmt.Println("Hello, my name is", p.Name)
}

john := Person{Name: "John", Age: 30}
john.sayHello()

常用特性

1. 并发编程

Go语言内置了轻量级线程——goroutine,可以运行并发的代码块。通过关键字go和通道(channel)实现并发编程。goroutine 类似于线程,但并非线程,可以将 goroutine 理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小。示例如下:

func main() {
    ch := make(chan int)

    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
        }
        close(ch)
    }()

    for num := range ch {
        fmt.Println(num)
    }
}

2. 自动垃圾回收

从C到C++,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是随之而来的是程序员要负责仔细管理内存。哪怕一点不小心就可能会导致“内存泄露”使得资源浪费或者“野指针”使得程序崩溃等,尽管C++11后来使用了智能指针的概念,但是程序员仍然需要很小心的使用。后来为了提高程序开发的速度以及程序的健壮性, java 和 C# 等高级语言引入了GC机制,由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。Go语言作为一门新生的开发语言,当然不能忽略内存管理这个问题,可以很自然地包含垃圾回收功能。开发者无需担心所指向的对象失效的问题,因此Go语言中不需要delete关键字,也不需要free方法来明确释放内存。

3. 支持函数多返回值

在 C/C++ 和其他的一些高级语言是不支持多个函数返回值的。但是这项功能又是必需的,所以在C语言中一般通过将返回值定义成一个结构体,或者通过函数的参数引用的形式来等效替代。而 Go 语言作为一种新型的语言,当然不能放弃对这一需求的满足,所以支持函数多返回值是必须的。

4. 接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。因此,我们可以通过将接口作为参数来实现对不同类型的调用,从而实现多态。

思考与分析

对比golang与C++、Java等语言,可以想到golang有以下几点让我们感到兴奋的创新:

1. 通道

Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,其最著名的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。这种方式极大地降低了并发编程的难度。

2. 快速编译

当前我们使用 Go 编写的最大微服务的编译时间只需数秒。相较于 Java 和 C++ 的编译速度,Go 的快速编译时间是一个主要的效率优势。

3. 工程协作

Go 非常简单,且易于学习。正是由于 Go 的简单性和标准化,任何的 Python、C++、PHP 或者 Java 开发者都可以迅速上手写出标准且一致的工程代码。

综上所述:Go语言是一门简洁高效、并发安全的现代编程语言。通过学习其基础语法和常用特性,我们可以更好地运用Go语言进行编程。