Go语言学习笔记(一)Let's 干吧

简介: 加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959简介    Go是Google开发的一种 静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

简介

    Go是Google开发的一种 静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。

    罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,稍后Ian Lance Taylor、Russ Cox加入项目。Go语言是基于Inferno操作系统所开发的。Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2012年早些时候发布了Go 1稳定版本。

    现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

 

    Go语言的语法接近C语言,但对于变量的声明有所不同。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go语言中动态加载部分函数。

    与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

    不同于Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。

 

语言特性

1. 垃圾回收

  1. 内存自动回收,再也不需要开发人员管理内存 
  2. 只需要new分配内存,不需要释放

2. 天然并发

  1. 从语言层面支持并发,非常简单
  2. Goroutine,轻量级线程,创建成千上万个Goroutine成为可能

  3. 基于CSP(Communicating Sequential Process)模型实现

3. channel

  1. 管道,类似unix/linux中的pipe
  2. 多个Goroutine之间通过channel进行通信

  3. 支持任何类型

  4. close 内置函数用来关闭 channel

4. Goroutine

    Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。

    Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。

    在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine。

 

编译器

    当前有两个Go语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。

    官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。

 

安装

下载地址:https://golang.org/dl/

设置环境变量:

  1. export GOROOT=$PATH:/path/to/go/
  2. export PATH=$PATH:$GOROOT/bin/
  3. export GOPATH=/home/user/project/go

终端测试:

  1. go version
  2. go env
  3. Gofmt -w *.go

IDE安装可参考:

  1. http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html

 

go 标准命令

go build

go build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包

go build -o bin/tongbupan go_dev/tongbupan/main
  -o :指定编译后存放目录以及名称

go install

go install用于编译并安装指定的代码包及它们的依赖包。

go get

go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。

go clean

go clean命令会删除掉执行其它命令时产生的一些文件和目录

go doc & godoc

go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。

godoc是一个很强大的工具,同样用于展示指定代码包的文档。

go run

go run命令可以编译并运行命令源码文件。

go run src/go_dev/hello.go
标记名称 标记描述
-a 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。
-n 打印编译期间所用到的其它命令,但是并不真正执行它们。
-p n 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1
-race 开启竞态条件的检测。不过此标记目前仅在linux/amd64freebsd/amd64darwin/amd64windows/amd64平台下受到支持。
-v 打印出那些被编译的代码包的名字。
-work 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
-x 打印编译期间所用到的其它命令。注意它与-n标记的区别。

go test

go test命令用于对Go语言编写的程序进行测试。这种测试是以代码包为单位的。

go list

go list命令的作用是列出指定的代码包的信息。

go fix与go tool fix

go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。

命令go fix其实是命令go tool fix的简单封装。

go vet与go tool vet

go vet是一个用于检查Go语言源码中静态错误的简单工具。

go vet命令是go tool vet命令的简单封装。

go tool pprof

go tool pprof命令来交互式的访问概要文件的内容。

go tool cgo

可以使我们创建能够调用C语言代码的Go语言源码文件。

go env

go env用于打印Go语言的环境信息。

名称 说明
CGO_ENABLED 指明cgo工具是否可用的标识。
GOARCH 程序构建环境的目标计算架构。
GOBIN 存放可执行文件的目录的绝对路径。
GOCHAR 程序构建环境的目标计算架构的单字符标识。
GOEXE 可执行文件的后缀。
GOHOSTARCH 程序运行环境的目标计算架构。
GOOS 程序构建环境的目标操作系统。
GOHOSTOS 程序运行环境的目标操作系统。
GOPATH 工作区目录的绝对路径。
GORACE 用于数据竞争检测的相关选项。
GOROOT Go语言的安装目录的绝对路径。
GOTOOLDIR Go工具目录的绝对路径。

 

 

Hello World 

package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

  

程序基本语法

  1. 所有go源码以.go结尾;
  2. 注释不会被编译,单行注释是以 // 开头,多行注释以 /* 开头,以 */ 结尾;
  3. 标识符以字母或下划线开头,大小写敏感,_ 是特殊标识符,用来忽略结果;
  4. 保留关键字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
append bool byte cap close complex complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int32 int64 iota len make new nil panic uint64
print println real recover string true uint uint8 uintptr

 

 

程序基本结构

1. 任何一个代码文件隶属于一个包

2. golang可执行程序,package main,并且有且只有一个main入口函数

3. 包中函数调用:

  1. 同一个包中函数,直接调用
  2. 不同包中函数,通过包名+点+函数名进行调用

4. 包访问控制规则:

  1. 大写意味着这个函数/变量是可导出的
  2. 小写意味着这个函数/变量是私有的,包外部不能访问

 

项目目录

$ tree project
project
├── bin
│   ├── example1
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── day1
│           ├── example1
│           │   ├── debug
│           │   └── hello.go
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── vender

Src 源码文件
Bin 编译后二进制文件
vender  第三方
pkg 静态文件

 

简单栗子

$ tree project
project
├── bin
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── test1
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── vender
[main.go]

package main

import (
    "fmt"
    "go_dev/test1/goroute_example/goroute"
)

func main() {
    pipe := make(chan int, 1)
    go goroute.Add(pipe, 10, 20)

    sum := <-pipe
    fmt.Println(sum)
}
[add.go]

package goroute

func Add(pipe chan int, a int, b int) {
    pipe <- (a + b)
}
$ go build -o bin/goroute_example go_dev/test1/goroute_example/main
$ bin/goroute_example 
30
$

 

相关文章
|
4天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
29 0
|
1天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
9 1
|
1天前
|
Go
|
2天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
131 1
|
2天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
109 0
|
2天前
|
缓存 NoSQL Go
Go语言中的分布式锁实现与选型
【5月更文挑战第6天】本文探讨了Go语言中分布式锁的实现,包括Redis、ZooKeeper和Etcd三种方式,强调了选型时的性能、可靠性和复杂度考量。通过代码示例展示了Redis分布式锁的使用,并提出了避免死锁、公平性等问题的策略。结论指出,开发者应根据业务需求选择合适实现并理解底层原理,以确保系统稳定和高效。
124 0
|
2天前
|
NoSQL 算法 Go
Go语言中的分布式事务处理方案
【5月更文挑战第6天】本文探讨了Go语言在分布式事务处理中的应用,包括2PC、3PC和TCC协议。通过示例展示了如何使用Go的`goroutine`和`channel`实现2PC。同时,文章指出了网络延迟、单点故障、死锁和幂等性等常见问题,并提供了相应的解决策略。此外,还以Redis Redlock为例,展示了如何实现分布式锁。理解并实施这些方案对于构建高可用的分布式系统至关重要。
95 0
|
3天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
42 1
|
3天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
40 1
|
3天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
25 1