编程语言已经很是多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C 等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特 定领域的语言有Erlang、R和MATLAB等,那么咱们为何须要 Go这样一门新语言呢?html
数据来源:https://www.tiobe.com/tiobe-index/python
编程语言排行榜前9名是至关稳定的,可是第10名每月都会变化,候选人就是GO、Swift和R。Swift是IOS移动应用程序的头号编程语言,可是仅仅适用IOS而不能用于Android,另外R语言的地位深深的被python压制。程序员
在2000年之前的单机时代,C语言是编程王中王。随着机器性能的提高、软件规模和复杂度提升、Java逐步取代了C的大佬地位。可是Java编程的体验并未尽人意。历年来Java的市场份额在逐步降低,后劲不足。golang
罗伯特·格瑞史莫,罗波·派克,肯·汤普逊于2006年1月2号下午15点4分5秒设计出了go语言。编程
Robert开发GO以前是Google v八、HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-八、plan9的做者;Ken主要是C、B语言、Unix之父。windows
后来Ian Lance Taylor、Russ Cox加入项目,Ian Lance Taylor是GCC的做者之一,目前负责GCC的Go实现;Brad Fitzpatrick以前是Memcache的做者,目前主要是HTTP2的实现做者。缓存
Golang是Google开发的一种静态强类型、编译型、并发型、具备垃圾回收功能的编程语言。Go语言做者之一Rob Pike在新文章“Go: Ten years and climbing”中,回顾了一下 Go 语言的发展过程。他们本身都没想到Go语言的迅猛发展,迅速成为了云计算领域中新一代开发语言,中国程序员对Go的热爱超出了他们的想象。并发
Go语言特点:运维
Go语言不会吞噬底层到C和C++的级别,也不会吞噬到Java的业务层。Go语言必定能吞噬的是Pass上的项目,例如消息缓存中间件、服务发现、日志收集、控制系统等。异步
Go语言杀手级的Docker应用优点:
安装Golang
Go安装 windows: 1、下载安装包 https://golang.org/dl/ 国外网站 https://studygolang.com/dl 国内网站 下载地址: https://studygolang.com/dl/golang/go1.11.windows-amd64.msi 2.安装 默认安装路径:C:\Go 3.环境变量已默认添加 C:\Go\bin;
Linux、MacOS
安装包下载地址:https://studygolang.com/dl
查看golang环境go env命令
C:\Users\yuchao>go env set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\yuchao\AppData\Local\go-build set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOOS=windows set GOPATH=C:\Users\yuchao\go #存放golang项目的目录,全部项目都放到gopath的src目录下 set GOPROXY= set GORACE= set GOROOT=C:\Go #golang的安装目录 set GOTMPDIR= set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 set GCCGO=gccgo set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD= set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Q C:\Users\yuchao>
http://docscn.studygolang.com/doc/code.html
go命令依赖一个重要的环境变量:$GOPATH,gopath定义go项目的工做目录。
例如go install 命令用于构建二进制命令,产生一个可执行的二进制文件,而后将该二进制文件做为hello安装到gopath的bin目录中。
在目录C:\Users\yuchao\go\src\go_study\hello\下建立hello.go文件,写入代码
package main //package关键字,指定hello.go属于哪一个包,指定main就是说是可执行程序 import "fmt" //导入格式化输出的fmt包 func main() { //func定义main函数,是程序的入口函数,在执行可执行二进制文件的时候,找到main函数体 fmt.Println("I am a gopher,i am saying 'Hello World!'") //fmt.Println打印并换行 }
go build 编译生成可执行文件 hello.exe
golang最小粒度是包
#go build 编译生成可执行二进制文件,go build 会去寻找gopath的src下的目录 C:\Users\yuchao\go>go build go_study/hello #执行hello.exe文件 C:\Users\yuchao\go>hello.exe I am a gopher,i am saying 'Hello World!' #go build 指定目录生成可执行文件 C:\Users\yuchao\go>go build -o bin/hello1.exe go_study/hello C:\Users\yuchao\go>cd bin C:\Users\yuchao\go\bin>hello1.exe I am a gopher,i am saying 'Hello World!'
go run 快速执行go文件,如同执行脚本同样
C:\Users\yuchao\go>go run go_study/hello I am a gopher,i am saying 'Hello World!'
go install编译成可执行文件到bin目录下
C:\Users\yuchao\go>go install go_study/hello C:\Users\yuchao\go>cd bin C:\Users\yuchao\go\bin>hello.exe I am a gopher,i am saying 'Hello World!'
go test 单元测试/压力测试
go fmt格式化源代码
故意写入乱的格式代码
package main //告知golang这是可执行文件 import "fmt" //导入格式化输出的package func main() { //主函数执行代码 fmt.Println("I am a gopher,i am saying 'Hello World!'") }
#go fmt格式化代码 C:\Users\yuchao\go\bin>go fmt go_study/hello
#此时查看源代码的格式
单行注释 // 多行注释 /* */
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等全部的命名,都遵循命名规则
一个名字必须以一个字母或下划线开头,后面能够跟任何数量的字母、数字、下划线
例如
_ab123
name
Age_12
严格区分大小写首字母,含义不一样,例如Name和name是不一样的
名字开头字母的大小写决定了名字在包外的可见性
Go语言推荐用驼峰式命名,如htmlEscape、NewConfigData、printHelp、
package main import "fmt" func main() { var _name = "YuChao" var Age = 18 fmt.Println(_name) fmt.Println(Age) }
Go语言预先定义好的,有特殊含义的关键字不能用于自定义名字,只能在特定语法结构体中用
Go语言有四种类型的声明语句:var、const、type和func,分别是变量、常量、类型、函数实体对象。
package main import "fmt" //变量声明语法 var identify type,定义变量并初始化,通常使用var声明全局变量
//go存在零值初始化机制,确保每一个声明的变量总有一个值,数值类型零值是0,布尔类型是false,字符串类型是空字符串,
接口或是(slice,map,chan和函数)变量对应零值是nil
/* var a int var b string var c bool var d int = 8 var e string = "hello" */ //var声明方式二 /* var ( a int //0 b string // "" c bool // false d int = 8 // 8 name string = "yuchao" //hello age = 18 //go编译器自动类型推导 ) */ //var声明方式三 //平行赋值,忽略类型声明,自动推导变量类型 var name,age,addr="chao",18,"shahe" func main() { fmt.Println(name,age,addr) fmt.Println(num1,num2,num3) //声明变量name且赋值"chao",简短声明,只能在函数内部使用定义局部变量 name := "chao" fmt.Println(name) }
常量使用const修饰,表明永远是只读的,不能修改。且const常量必须有值
package main import ( "fmt" ) //const pi = 3.1415926 //常量必须赋值,不写就报错 /* 优雅的写法 const ( //go的类型推导,编译器会根据值,推导出类型,是字符串,仍是数字 birthDay = "1993-10-1" pi = 3.1415926 ) */ const ( a int = 100 b //这里若是不写值和类型,会使用上一层a的值 c int = 200 d //同理使用c的值 ) func main() { //fmt.Printf("birthDay=%v\n", birthDay) //fmt.Printf("pi=%v", pi) fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d) }
常量声明也能够用iota常量生成器初始化,它用于生成一组类似规则初始化的常量。可是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在行,iota会被设置为0,而后在每个有常量声明的行加一。
func main() { //fmt.Printf("birthDay=%v\n", birthDay) //fmt.Printf("pi=%v", pi) fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d) const ( e = iota f // f=iota g //g=iota ) fmt.Printf("e=%d f=%d g=%d\n", e, f, g) //iota实际用在time包中的效果 //周日为0,周一为1,依次推导 type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday ) fmt.Printf("Monday is %d\n", Monday) fmt.Printf("Saturday is %d\n", Saturday) }
布尔类型
package main import "fmt" //定义无参函数 func testBool() { var a bool fmt.Println(a) a = true fmt.Println(a) a = !a fmt.Println(a) var b bool = true if a == true && b == true { fmt.Println("正确") } else { fmt.Println("错误") } if a == true || b == true { fmt.Println("||正确") } else { fmt.Println("||错误") } fmt.Printf("%t %t\n", a, b) } func main() { testBool() }
goland IDE
下载地址:https://www.jetbrains.com/go/download/#section=windows 激活地址: http://idea.lanyus.com/