前言
任何新技术的出现:无非是出于2种原因,相对之前提升了效率 或者 使用这种技术更加便捷。
go语言是一种新型的开源计算机编程语言,天然利用了 多核优势 性能优越支持大并发,go开发的代码编译后 可以在Windows和Linux环境到处运行 不用额外装什么Java、Python环境、配置环境变量....
轻松地支持大并发
代码部署简单
这2点深深吸引了我。
/* 在写go代码的开始一定要声明,当前的文件属于什么类型的包, 定义了1个main包 也就是可独立执行的程序 每1个go程序都应该包含1个main包 */ package main /* 导入1个包 */ import "fmt" /* 定义程序启动后 执行的第1个main函数*/ func main() { fmt.Println("Hello Martin") } /* go文件是以.go结尾的文件 必须包含在1个目录下 */
一、什么是go语言
Google开源
2007年在Google公司内部萌芽的语言,2009年Google讲go正式开源
编译性语言
Python、php代码都是由解释器 把代码翻译成字节码 一边解释一边执行,而go、c、c++是编译工具编译成二进制文件 直接交给操作系统执行。
所有编译性语言和解释型语言对比 少了1个中间翻译的环节,执行起来就会更快,在部署这些程序的时 也比较简便 因为不需要下载解释器,只需要把二进制可执行文件copy到服务器 交给操作系统执行二进制文件即可。
21世纪的C语言
C、C++、Python、Ruby、JavaScript都诞生于 多核出现之前(2005年),而go语言出现在多核时代之后,所以 go在设计支持就考虑到了适配多核CPU,天生支持了并发,不需要像Python借助 借助第三方的库、复杂的语法糖 支持并发。
go语言设计的宗旨就是 简化了c的语法兼顾了c的性能 所以go=c+python
为了能拿到来着以下大厂的offer Let's go.
执行go代码
1.go run
解释执行 go文件
D:goprojectsrchello>go run hello.go
Hello Martin
2. go build
把go文件编译成二进制文件
2.1在代码所在目录下编译
D:goprojectsrchello>go build hello.go
2.2 在其他目录下编译go代码
需要指定 go文件的路径但是 也就是 go pathsrc目录后面的路径,这样做的结果是你什么路径下执行的go build 那个编译好的 二进制文件就在什么路径下
C:UsersAdministrator.PC-20170811HMNW> go build code.zhanggen.comstudygoday01hello
2.3 go build -o 指定二进制文件名
D:goprojectsrchello>go build -o 爱叫啥叫啥
3.go install
编译二进制文件 + 把编译好的二进制文件自动放在 gopath/bin目录下
D:goprojectsrchello>go install hello
4.交叉编译(跨平台编译)
我们一般在Windows/Mac开发 去Linux部署,那么如何在Windows、Mac平台编译出Linux可以执行二进制文件呢?
Windows ----Linux
D:goprojectsrchello>SET CGO=ENABLED=0 //禁用CGO D:goprojectsrchello>SET GOOS=linux D:goprojectsrchello>SET GORACH=adm64 D:goprojectsrchello>go build hello.go
Mac ---Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux ------- Mac
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
Linux-----Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows ---Mac
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build
Go程序的目录结构
在go path下的
bin:存放编译之后的二进制文件程序的入口
pkg:源码编译成二进制文件过程中产生的包
src:存放go源码
注意每1个go文件都要存放到1个目录里面
go语言定义 变量和常量
Go是一门静态语言 不同于Python、JavaScript 等动态语言 变量声明时就要指定数据类型、声明之后如果是局部变量 就必须要使用否则会编译不通过。
还有1个很大不同Go的执行语句都必须写在函数里面,函数外面只能声明变量 、声明函数。
注意事项:
a.函数外的每个语句必须以关键字开始(var、const、func)
b. :=只能使用于函数内,不能使用在函数外
c._多用于占位,表示忽略
d.同一个作用域中 不能同时声明2个相同的变量
package main import "fmt" //Go语言推荐使用驼峰式命名 //变量既可以声明在函数体内也可以声明在函数体外 var name string var age int var isOk bool //Go语言推荐使用驼峰式命名 //批量声明 不用每次都写个 var var ( name1 string //没有赋值前默认为空字符 "" age1 int //没有赋值前默认为0 isOk1 bool //没有赋值前默认为false ) //变量初始化(对声明的变量进行赋值) func main() { name = "Martin" age = 18 isOk = true //Print 在终端打印不会加换行 fmt.Print(name1) //Println 打印内容后面自动加上换行 fmt.Println(age1) //Printf支持内容格式化输出 fmt.Printf("name:%s age:%d isOk: %t", name, age, isOk) var name2 string name2 = "Martin2" //name2 declared and not used fmt.Println() //打印1换行 fmt.Print(name2) //变量只要在函数内 声明之后 就必须要使用 否则会编译不通过 }
声明变量的同时赋值
package main import "fmt" func main() { //声明变量的同时赋值 var name3 string = "Martin3" //数据类型自动推到 var age3 = 20 //简短变量声明(只能用于函数) isOk3 := false fmt.Println(name3, age3, isOk3) }
常量+iota
程序目录结构、变量声明 +赋值 、 开始感受到Go的严谨了,常量就是一经声明和赋值,在程序运行期间 就不可以更改的变量。
声明常量 默认值
package main import "fmt" //声明1个常量 const pi = 3.14 //批量声明常量 const ( StatusOk = 200 PathNotFind = 404 ) //批量声明常量时 没有赋值的情况下默认和上一行一致 const ( n1 = 100 n2 //没有赋值默认值为该变量上面的值 也就是100 n3 ) func main() { fmt.Printf("n1:%d n2:%d n3:%d", n1, n2, n3) }
iota
iota 是go语言中的常量计数器,只能在常量的表达式中使用
iota在const关键字出现时将被重置为0
const中每新增1行常量声明将使 iota 计数 +1(类似于MySQL id列)
package main import "fmt" //声明1个常量 const pi = 3.14 //批量声明常量 const ( StatusOk = 200 PathNotFind = 404 ) //批量声明常量时 没有赋值的情况下默认和上一行一致 const ( n1 = 100 n2 //没有赋值默认值为该变量上面的值 也就是100 n3 ) //iota const ( a0 = iota //0 a1 = iota //1 a2 = iota //2 ) const ( b0 = iota b1 //b1=iota _ b2 ) //iota 插队 const ( c1 = iota c2 = 100 c3 c4 = iota //3每新增1行 iota +1 由于新增的2行 iota=3 c5 ) //多个常量声明在1行 const ( d1, d2 = iota + 1, iota + 2 //d1=0+1,d2=0+2 注意:因为常量声明在了同行所有 不会加1 d3, d4 = iota + 1, iota + 2 // d3=1+1,d4=1+2 ) //定义数量级 const ( _ = iota KB = 1 << (10 * iota) //1左移 10位 MB = 1 << (10 * iota) //1左移 20位 GB = 1 << (10 * iota) //1左移 30位 TB = 1 << (10 * iota) //1左移 40位 PB = 1 << (10 * iota) //1左移 50位 ) func main() { // fmt.Printf("a0:%d a1:%d a2:%d", a0, a1, a2) // fmt.Printf("b0:%d b1:%d b2:%d", b0, b1, b2)//0 1 3 //fmt.Printf("c1:%d c2:%d c3:%d c4:%d c5:%d", c1, c2, c3, c4, c5) //0 100 100 100 // fmt.Print(d1, d2, d3, d4) fmt.Print(KB, MB, TB, PB) }
Go文件基础语法总结
编程语言就是人类和计算机交流的工具,就像人类和人类之间交流使用的汉语、英语、日语、汉语一样,由于发明和使用它们的人们地域、文化、思想、追求、价值不同,所以它们的语法和风格有不同之处,但除了地域不同之外 我们也有很多相同之处。
I like sunny girl who has long brown hair.
我喜欢一个开朗、有着棕色的长头发的女孩。
咬文嚼字地分析一下汉字和英文
英语:先说我喜欢阳光的姑娘,然后再丰富具体的细节。(先说重点.....再慢慢补充)
中文:把所有形容词都形容出来了再说表语 (先慢慢铺垫....最后出现重点)
虽然中文和英文的有些语法不同, 但2句话最终要做的事情是一样的 约会。
学会采用 2者对比的方式 来记忆、学习、理解不同的东西。
-------------------------------------------------------------------------------------------------------------
1.存放Go源代码的文件后缀名以.go结尾不是.py了
2.文件第一行 使用 package main声明文件作用类型(声明这是 1个可执行文件?还是写得1个供别人调用使用的模板)
3.如果是1个可执行的文件,必须要有main包和main函数,这个mian函数也是程序执行的入口
4.Go语言函数体外的语句必须以关键字(var、func、const)开头(不像Python那样在py文件里任意位置 写什么代码都行)
5.函数内部的变量必须使用(所以Go中有哑元变量 _ ,它的作用就是仅接收变量 但不使用)
print打印
Go里面使用fmt这个包实现打印输出的功能,但是这个包里面的方法有很多,不像Python里面就1个print()全部搞定
目前printf支持以下格式的输出,例如:
printf("%c",a);输出单个字符。
printf("%d",a);输出十进制整数。
printf("%f",a);输出十进制浮点数.
printf("%o",a);输出八进制数。
printf("%s",a);输出字符串。
printf("%u",a);输出无符号十进制数。
printf("%x",a);输出十六进制数。
package main import ( "fmt" ) func main() { //fmt var n1 = 100
FirstName='张' name := "张根" fmt.Printf("%T ", n1) //查看变量的数据类型 fmt.Printf("%b ", n1) //查看2进制 fmt.Printf("%o ", n1) //查看8进制 fmt.Printf("%d ", n1) //查看10进制 fmt.Printf("%x ", n1) //查看16进制 fmt.Printf("%s ", name) //查看字符串 fmt.Printf("%v ", name) //查看变量值 fmt.Printf("%#v ", name) //打印带双引号的"变量值"
fmt.Printf("%c",FirstName) //打印字符
}