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数据类型与操作符

  1. 布尔类型
  2. 整数和浮点数类型
  3. 字符串类型

布尔类型

  • 布尔类型的值有两种: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的更多相关文章

  1. Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署

    序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...

  2. IOC容器特性注入第一篇:程序集反射查找

    学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...

  3. 开博第一篇:DHT 爬虫的学习记录

    经过一段时间的研究和学习,大致了解了DHT网络的一些信息,大部分还是参会别人的相关代码,一方面主要对DHT爬虫原理感兴趣,最主要的是为了学习python,大部分是别人的东西原理还是引用别人的吧 DHT ...

  4. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  5. go [第一篇]初识

    [第一篇] 简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发 ...

  6. 阿里云一 第一篇:云服务器ECS

    阿里云(www.aliyun.com)创立于2009年,是全球领先的云计算及人工智能科技公司,为200多个国家和地区的企业.开发者和政府机构提供服务.截至2017年3月,阿里云付费云计算用户达87.4 ...

  7. 秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

    http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...

  8. 入木三分学网络第一篇--VRRP协议详解第一篇(转)

    因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...

  9. 第一篇:Django基础

    Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model ...

  10. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

随机推荐

  1. 20135202闫佳歆--week6 课本第三章学习笔记

    第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...

  2. 蜗牛慢慢爬 LeetCode 16. 3Sum Closest [Difficulty: Medium]

    题目 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  3. poj2135 Farm Tour(费用流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  4. Queries about less or equal elements CodeForces - 600B(二分)

    You are given two arrays of integers a and b. For each element of the second arraybj you should find ...

  5. Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)

    题意: 有n门考试,每门考试都有两个时间,存在几门考试时间冲突,求考完所有的考试,所用的最后时间的最小值 解析: 对于时间冲突的考试 就是一个联通块 把每个考试看作边,两个时间看作点,那么时间冲突的考 ...

  6. 论如何优雅的用bitset来求四维偏序

    四维偏序.. 就是给你一个四维集合.再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=as ...

  7. 【小记】FreeRTOS任务创建后但任务中为空时运行错误

    FreeRTOS任务创建后但任务中无语句为空时运行错误 会死在文件<port.c>中下边函数处 static void prvTaskExitError( void ){ /* A fun ...

  8. 洛谷 P4389 付公主的背包 解题报告

    P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\ ...

  9. suoi31 最近公共祖先2 (倍增lca)

    根为r时x.y的公共祖先,就是lca(x,r),lca(x,y),lca(r,y)中深度最大的那一个,不要再在倍增的时候判来判去还判不对了... #include<bits/stdc++.h&g ...

  10. JavaScript -- 标签 , Break 和 Continue 语句

    break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. 标签引用,break 语句可用于跳出任何 JavaScript 代码块. demo: <!DOCTYPE html& ...