基础语法- Go语言快速入门[1-1 Golang]

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 main

import "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 main

import "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 main

import "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 main

import (
  "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语言的全面探索。

你可能感兴趣的:(go)