Go语言是Google开发的一种编程语言,它是动态的、强类型的、编译的、并行的,具备垃圾收集的性能。Go语言能够在不损失应用程序性能的状况下升高代码的复杂性。

Go语言语法简略,只有25个关键词,不须要花工夫去学习和记忆;数据类型包含布尔、数字(整数、浮点、复数)、字符串、切片(数组)、字典映射、管道扭转等。,用起来比拟顺滑。

Go语言天生具备并发个性,基于Go关键字很容易创立协同学来执行一些并发工作。与传统简单的多线程同步计划相比,其基于协同学-流水线的CSP并发编程模型能够说简略得多。

Go语言还具备垃圾回收的能力,防止了应用层须要关注内存的调配和开释。要晓得,在C/C++语言中,内存治理是一件很头疼的事件。

Go语言还提供了绝对残缺的规范库。例如,咱们只须要几行代码来创立和启动HTTP服务。

从这篇文章开始,咱们将率领你进入围棋语言的世界。

环境建设

咱们能够抉择下载编译装置的源代码,下载安装包,下载编译好的可执行文件。下载地址是:https://golang.google.cn/dl/.

本地装置是go1.18.darwin-amd64.tar.gz,这是一个编译后的可执行文件。您只须要将其解压缩,并将其解压缩到目录$home/documents/go 1.18。最初,配置以下环境变量:

export go root = $ HOME/Documents/go 1.18导出门路=$PATH:$GOROOT/bin导出GOPATH=$HOME/Documents/gopath

$GoROOTGO的装置目录$PATH是这样的,咱们能够在任何目录下执行go命令;$GOPATH工作目录,通过go get命令下载的依赖包等。放在$GOPATH目录中,基于gomod治理的依赖文件也会放在这个目录中。

装置实现后,执行go version验证装置是否胜利。

一个适合的编辑器是Go我的项目开发不可或缺的。举荐应用Goland,下载地址为:https://www.jetbrains.com/go/.装置结束后,关上Goland新我的项目,新建一个main.go文件,编写经典的hello world:

主包装

导入“fmt”func main() {fmt。Println(“你好世界”)}

Go语言的所有文件都必须指定所在的包,比方下面的“package main”,咱们称之为主包。当然,包名也能够用其余名称命名(个别包名与当前目录/文件夹名统一),主包中的次要性能是程序的入口性能。

咱们的代码必定会保留在其余文件中。怎么介绍?通过“导入包名”,包中的函数/变量只有在导入后能力拜访。如下面的代码所示,fmt包是Go语言底层提供的格式化/IO包,Println函数将变量打印到规范输入。

数据类型

Go语言数据类型包含布尔、数字(整数、浮点、复数)、字符串、切片(数组)、字典映射、管道扭转等。各种变量的申明和简略应用如下:

package mainimport "fmt"func main() {  //变量申明  var a int = 1 //var 申明并初始化变量, 类型int能够省略  b := 1 //:= 申明+初始化变量  b = 3 //=只能针对已有变量从新赋值  fmt.Println(a, b)  //字符串  str1 := "hello "  str2 := "world"  fmt.Println(len(str1), str1 + str2)  //能够 +;len返回字符串长度  //数组,容量固定  arr := [5]int{1,2,3,4,5}  arr[1] = 100 //数组元素拜访  fmt.Println(len(arr), arr) //len返回数组长度  //切片,容量能够裁减,相当于动静数组  slice := []int{1,2,3}  slice[1] = 100 //切片元素拜访  slice = append(slice, 4, 5, 6) //append主动扩容  fmt.Println(len(slice),cap(slice), slice) //len返回切片长度,cap返回切片容量  //map,key-value构造  score := map[string]int{    "zhangsan":100,    "lisi":99,    "wangwu":98,  }  score["who"] = 90 //map赋值  s, ok := score["who"] //map拜访,s对应value值,ok标识该key是否存在(不存在返回空值)  delete(score, "lisi") //删除map元素  fmt.Println(s, ok, score)}

这里没有管道变更示例,这将在第2章并发模型中具体介绍。当然,除了Go语言提供的这些根本类型,咱们还能够自定义类型,比方接口、构造等。,这也将在前面的章节中介绍。

分支构造

与其余语言相似,Go语言也反对if/switch分支构造和for循环构造,如下所示:

package mainimport "fmt"func main() {  //if分支  condition := true  if condition {    fmt.Println("true")  }else{    fmt.Println("false")  }  //wsith分支  expr := "zhangsan"  switch expr {  case "zhangsan":    fmt.Println("zhangsan")  case "lisi":    fmt.Println("lisi")  default: //没有匹配到,默认执行    fmt.Println("who")  }  //for循环  for i := 0; i < 100; i ++ {    if i /2 == 0 {      fmt.Println("偶数")    }  }  //无条件循环,死循环  i := 0  for {    i ++    fmt.Println("loop")    if i > 100 { //检测条件,提前break退出循环      break    }  }}

性能

函数的定义,比方名字、参数、返回值等基本概念,这里就不介绍了。Go语言和其余语言的区别在于它反对多个返回值(大多数语言只能返回一个值)和变量参数(大多数语言实际上都反对)。此外,Go语言还反对闭包(匿名函数)。例子如下:

package mainimport "fmt"func main() {  add, sub := addSub(4, 3)  fmt.Println(add, sub)  sum(1, 2, 3)    nums := []int{1, 2, 3, 4}  sum(nums...) //切片转可变参数,通过...实现  //变量f为函数类型  f := func (in string) {    fmt.Println(in)  }  f("hello world") //执行函数  //申明匿名函数,留神与下面却别,加括号间接执行该匿名函数  func (in string) {    fmt.Println(in)  }("hello world")}//返回两个int值func addSub(a, b int) (int, int){  return a + b, a - b}//...示意参数数目可变func sum(nums ...int) {  total := 0  //nums其实是切片类型([]int),for + range 可遍历切片元素  for _, num := range nums {    total += num  }  fmt.Println(total)}

协成并发

Go是一种具备并发个性的语言。基于Go关键字,很容易创立一个流程来执行一些并发工作。上面的程序创立10个协同并发执行工作,主协同期待每个子协同的执行,而后主动退出:

package mainimport (  "fmt"  "sync")func main() {  //WaitGroup用于协程并发管制  wg := sync.WaitGroup{}  //启动10个协程并发执行工作  for i := 0; i < 10; i ++ {    //标记工作开始    wg.Add(1)    go func(a int) {      fmt.Println(fmt.Sprintf("work %d exec", a))      //标记工作完结      wg.Done()    }(i)  }  //主协程期待工作完结  wg.Wait()  fmt.Println("main end")}

重要

作为深刻理解Go语言系列文章的第一篇,本文简要介绍了Go语言的根本语法,包含根本数据类型、分支构造、函数等基本概念,旨在让大家对Go语言有一个初步的理解。从下一篇文章开始,咱们将开始对Go语言的全面摸索。