Golang简介
编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C 等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特 定领域的语言有Erlang、R和MATLAB等,那么我们为什么需要 Go这样一门新语言呢?
数据来源:https://www.tiobe.com/tiobe-index/
编程语言排行榜前9名是相当稳定的,但是第10名每个月都会变化,候选人就是GO、Swift和R。Swift是IOS移动应用程序的头号编程语言,但是仅仅适用IOS而不能用于Android,另外R语言的地位深深的被python压制。
在2000年以前的单机时代,C语言是编程王中王。随着机器性能的提升、软件规模和复杂度提高、Java逐步取代了C的大佬地位。但是Java编程的体验并未尽人意。历年来Java的市场份额在逐步下降,后劲不足。
Go语言作者
罗伯特·格瑞史莫,罗波·派克,肯·汤普逊于2006年1月2号下午15点4分5秒设计出了go语言。
Robert开发GO之前是Google v8、HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-8、plan9的作者;Ken主要是C、B语言、Unix之父。
后来Ian Lance Taylor、Russ Cox加入项目,Ian Lance Taylor是GCC的作者之一,目前负责GCC的Go实现;Brad Fitzpatrick之前是Memcache的作者,目前主要是HTTP2的实现作者。
Go语言与新技术
Golang是Google开发的一种静态强类型、编译型、并发型、具有垃圾回收功能的编程语言。Go语言作者之一Rob Pike在新文章“Go: Ten years and climbing”中,回顾了一下 Go 语言的发展过程。他们自己都没想到Go语言的迅猛发展,迅速成为了云计算领域中新一代开发语言,中国程序员对Go的热爱超出了他们的想象。
Go语言特色:
- 语法简单、上手快
- 并行和异步编程几乎无痛点,Go语言的Goroutine和Channel是并发编程两大神器,而C、Java、Python等语言的并发和异步控制比较麻烦,还很容易出错,而Go解决这个问题非常优雅流畅
- 互联网时代的C语言,C语言关注执行效率和性能与底层友好,而python是用尽量少的代码完成更多的事。而Go语言期望完成一种C+python的统一,解决开发效率和底层应用开发
- Go语言有Google世界一流的技术公司支持
- 杀手级应用Docker
Go语言不会吞噬底层到C和C++的级别,也不会吞噬到Java的业务层。Go语言一定能吞噬的是Pass上的项目,例如消息缓存中间件、服务发现、日志收集、控制系统等。
Go语言杀手级的Docker应用优势:
- Docker上手容易
- 解决了运维中的环境问题
- Google的支持
- k8s
使用Go语言的公司
Golang环境
安装Golang
Go安装
windows:
、下载安装包
https://golang.org/dl/ 国外网站
https://studygolang.com/dl 国内网站
下载地址: https://studygolang.com/dl/golang/go1.11.windows-amd64.msi
.安装
默认安装路径:C:\Go
.环境变量已默认添加
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=
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>
Golang目录结构
http://docscn.studygolang.com/doc/code.html
go命令依赖一个重要的环境变量:$GOPATH,gopath定义go项目的工作目录。
例如go install 命令用于构建二进制命令,产生一个可执行的二进制文件,然后将该二进制文件作为hello安装到gopath的bin目录中。
用golang向世界say hello world
在目录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程序结构
- go源码按照package进行组织,并且package必须放在非注释的第一行
- 一个程序只能有一个main包和一个main函数(一个目录下不能有多个package main)
- main函数是程序的执行入口
Go注释
单行注释
//
多行注释
/* */
Go命名
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循命名规则
一个名字必须以一个字母或下划线开头,后面可以跟任何数量的字母、数字、下划线
例如
_ab123
name
Age_12
严格区分大小写首字母,含义不同,例如Name和name是不同的
名字开头字母的大小写决定了名字在包外的可见性
Go语言推荐用驼峰式命名,如htmlEscape、NewConfigData、printHelp、
package main import "fmt" func main() {
var _name = "YuChao"
var Age =
fmt.Println(_name)
fmt.Println(Age)
}
Go关键字
Go语言预先定义好的,有特殊含义的关键字不能用于自定义名字,只能在特定语法结构体中用
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",,"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 =
b //这里如果不写值和类型,会使用上一层a的值
c int =
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常量生成器
常量声明也可以用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)
}
Go数据类型与操作符
- 布尔类型
- 整数和浮点数类型
- 字符串类型
布尔类型
- 布尔类型的值有两种:true和false
- if和for语句的条件部分都是bool类型的值
- ==和< > 等比较操作也会产生布尔型的值
- 一元操作符!对应逻辑非操作,!true的值是false
- 布尔值可以和&&(and)和 ||(or)操作符结合
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/
第一篇:初始Golang的更多相关文章
-
Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署
序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...
-
IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
-
开博第一篇:DHT 爬虫的学习记录
经过一段时间的研究和学习,大致了解了DHT网络的一些信息,大部分还是参会别人的相关代码,一方面主要对DHT爬虫原理感兴趣,最主要的是为了学习python,大部分是别人的东西原理还是引用别人的吧 DHT ...
-
第一章.java&;golang的区别之:闭包
对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...
-
go [第一篇]初识
[第一篇] 简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发 ...
-
阿里云一 第一篇:云服务器ECS
阿里云(www.aliyun.com)创立于2009年,是全球领先的云计算及人工智能科技公司,为200多个国家和地区的企业.开发者和*机构提供服务.截至2017年3月,阿里云付费云计算用户达87.4 ...
-
秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】
http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...
-
入木三分学网络第一篇--VRRP协议详解第一篇(转)
因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...
-
第一篇:Django基础
Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model ...
-
linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
随机推荐
-
C++:为什么说 goto 没有用
要了解一个功能有没有用,首先应该分析它能实现的所有功能. goto 可以实现的功能只有两种:一,向前面跳:二,向后面跳.这两种情况对应三种功能:一,重复执行也就是循环:二,跳过一段代码也就是条件判断: ...
-
Windows安装java
1.下载并安装java(jdk)//在官网下载即可——http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363. ...
-
学习linux与wp8.1——启航
现在不知不觉已经大三了,而本专业的东西没有多大感兴趣的,我看好wp开发和linux开发. 为什么要学习wp开发?其实就是一种兴趣,我手中有部620而已,学着学着就感兴趣了,所以打算继续学下去.同时,我 ...
-
高效测试用例组织算法pairwise之Python实现
------------------------------------------本文专为<光荣之路培训 >原创,如有转载请注明出处--------------------------- ...
-
VMware安装Linux,系统分区。
系统分区: 主分区<=4 扩展分区<=1 主分区+扩展分区<=4 扩展分区不能直接使用,必须再分成若干逻辑分区才能读写数据. 逻辑分区编号从5开始,1-4给主分区和扩展分区使用的,不 ...
-
Asp.Net Core 2.0 项目实战(7)MD5加密、AES&;DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
-
zxing二维码的生成与解码(C#)
ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和An ...
-
FZU2259 : 图
假设删除的边是$(u,v)$,分两种情况讨论: $1.$删除$(u,v)$之后$(u,v)$不再连通,那么说明$(u,v)$是图的桥,同时整个图都要是二分图. $2.$删除$(u,v)$之后$(u,v ...
-
Introduction to One-class Support Vector Machines
Traditionally, many classification problems try to solve the two or multi-class situation. The goal ...
-
Ubuntu上开启Apache Rewrite功能的方法
Ubuntu上开启Apache Rewrite功能的方法 本文介绍ubuntn系统中开启apache的urlrewrite功能的方法. 在Windows上开启Apache的urlRewrite非常简单 ...