Go语言入门指南 | 青训营

75 阅读3分钟

Go语言特性

  • 语言简洁、学习曲线平缓:一名学习过c++的程序员从上手Go语言,到熟练使用,只需要一周左右时间

  • 开发效率高:Go语言内置垃圾回收机制,大大提高其开发效率

  • 代码风格统一:Go语言提供了一套格式化工具——fmt,可以保证不同开发者提交的代码都是统一的格式。

  • 支持并发

  • 有丰富的标准库

  • 跨平台

基础语法

我们仍然从helloworld开始

package main
import {
    "fmt"
}
func main(){
    fmt.Println("Hello,world")
}

首先,第一行package 包名,相当于一个集合,使用时注意,main包时程序入口的包,自定义包,存放自己的go文件

再看第二行 import,这是导包操作,用于引入其他包的内容,和java的import,c的include一样

最后我们导入了fmt,使用了fmt.Println()函数。

变量

var str="sss"
str:="ssss"

切片

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

定义一个未定义大小的切片

var identifier []type

切片也不需要说明长度。

或使用make()函数来创建切片。

var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)

也可以指定容量

make([]T, length, capacity)

切片初始化

s:=[] int {1,2,3}
s:=arr[startIndex:endIndex] //用数组初始化切片

切片的截取

通过设置下限和上限截取切片(前闭后开原则:[2:5],包含2,不包含5位置)

切片的增加

append 我们如果想要增加切片容量,必须是新创建一个更大的切片,吧旧的拷贝过去。

s=append(s,10)

Go 并发

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

goroutine 语法格式:

//go 函数名( 参数列表 )
package main

import (
        "fmt"
        "time"
)

func say(s string) {
        for i := 0; i < 5; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Println(s)
        }
}

func main() {
        go say("world")
        say("hello")
}

通道(channel)

通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

ch := make(chan int)
ch <- v    // 把 v 发送到通道 ch
v := <-ch  // 从 ch 接收数据
           // 并把值赋给 v

注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。

通道缓冲区

通道可以设置缓冲区,通过 make 的第二个参数指定缓冲区大小:

ch := make(chan int, 100)

带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。

不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。

注意:如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。