一,第一个go程序,hello world!!!
创建learngo目录,再创建src,最后编写hello.go文件
package main import ( "fmt" ) func main(){ fmt.Printf("hello world!!!") }
从第一个go程序中,我们可以初始认识一下go 语言的程序结构
1,package 声明go语言的包,
2,import 导入包
3,func main() {} go语言函数
在go语言中 需要注意的几个地方
(1)packeage main 表示这个包是可以编译成可执行文件的(可执行文件和库的区别是,可执行文件编译完成之后,就可以独自执行,如果是库文件编译完后只能生产一个lib库,lib库只能被其它可执行程序调用)
(2)go 语言中导入的包或者定义的变量,函数等,需要在程序中使用,如果没有使用,程序编译会报错。这也是Go语言中遵循极简的编程思路
编写完第一个go程序后,如何运行? 找到你编写的go 文件,然后执行 go run src/hello.go(快速执行go 文件)
二,go 语言中命令的常规使用
(1)go语言环境变量的查看,在windows 下执行go env 即可列出go语言的所有环境变量
这些变量中最重要的是GOPATH,所有的源码,程序都放在GOPATH中,GOPATH 路径最好只设置一个
另外 go 语言有是跨平台的,在windows 下编写一个go 程序,完成编译后,在Linux下任然可以执行
(2)go build 命令是用来编译go 程序的,编译完成之后会生成一个.exe 二进制文件,这个文件不论放在那里都可以执行, go build project/webdev/main, 在编译命令中,只需要写src 以后的文件路径就可以
(3)go install 命令是安装可执行文件到bin目录 go install project/webdev/main,第一次执行go install后GOpath 中会自动生成一个bin 目录,这个bin 目录存放所有编译后的可执行程序
(4). 就可以运行编译后的可执行的.exe 文件
(5)go test 执行单元测试,源码文件名称中加上_test ,在文件中定义函数,函数命定义func Testadd(t *testing.T),go 语言在编译中不会将测试文件编译到其中
测试代码示例
package calc import ( "testing" #导入testing 模块 ) func TestAdd(t *testing.T) { #test 函数定义 var sum int sum = Add(5, 6) if sum != 10 { t.Fatalf("add is not right, sum:%v expected:11",sum) #定义出错时输出 } t.Logf("add is ok") #打印正确日志 }
(6)go fmt 格式化所有源码,将源码的格式进行标准化, go fmt -w ./* 可以当前目录下所有文件都格式化
三,编写自定义的go 语言包
(1)新建一个目录,例如calc
package cale #声明这个包的名字,最好是和自己所创建的目录一致 func Add(a int, b int) int { #本句中,前两个int是声明参数的数据类型,后一个int为返回值的类型 #go 语言为强类型语言,变量一般都需要指定类型 return a+b }
(2)新建go的包后,如何在其它代码中引导入,(注意,导入的时候需要把整个包都导入,不能单独导入包中的某个.go文件)
package main import ( "fmt" cale "project/webdev/calc" #导入自定义包(导入路径是src之后的路径)
#路径前面的cale为包设置别名 ) func main() { x := calc.Add(1,2) #go 语言中包中的函数的调用,包的名字的.函数导入 fmt.Printf("x:%d".x) }
(3)go 语言中包的组织,需要注意,在同一个目录下,所有的go 源码文件中声名包都只能有一个,即package 包名 只能有一个,如果出现多个,会出现编译报错,另外,包的名字为main 而且有func main 这个包编译完之后是可执行的
四,go 语言多线程的定义
基于CSP 模型实现
func calc() {
//大量计算
}
func main() {
go calc() #在函数前面添加go 语句
}
五,go语言中程序通信方式----只有管道
(1)管道,类似unix/linux中的pipe
(2)多个goroute 之间通过channel进行通信
(3)支持go语言中的任何类型
func main() { pipe := make(chan int,3) #pip := 定义pip 变量,make 分配空间 pipe <- 1 #chan 管道,int 为管道中的数据类型,3为管道的内存大小 pipe <- 2 #<- 存入数据
var a int
a <- pipe #读取管道中的数据 }
六,go语言返回多个值
go语言中需要在函数定义时就定义返回值的类型
func calc(a int, b int) (int,int) { #(int,int)定义返回值的类型 sum := a+b avg := (a+b)/2 return sum, avg #返回多个值 }