接下来让我们来看下简单的代码 test.go ,该代码输出了"Hello World!":
package main
import "fmt"
func main() {
/* 这是我的第一个简单的程序,我是块注释 */
// 我是单行注释
fmt.Println("Hello, World!")
}
让我们来看下以上程序的各个部分:
1. 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行
指明
这个文件属于哪个包,如:package main。package main表示一个可独立执行
的程序,
每个 Go 应用程序都包含一个名为 main 的包。
2. 下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,
或其他元素),
fmt 包实现了格式化 IO(输入/输出)的函数。
3. 下一行 func main() 是程序开始执行的入口函数。main 函数是每一个可执
行程序所必须
包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先
执行该函数)。
可执行文件是指 放在系统环境变量下的文件
系统环境变量可以用 echo $PATH 查看
传递给echo 的参数将被打印到标准输出中
4. 下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释
1/2形式,你可以
在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开
头,并以 */ 结尾,
且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
5. 下一行 fmt.Println(...) 可以将字符串输出到控制台终端,并在最后自动增加
换行字符 \n。
使用 fmt.Print("hello, world\n") 可以得到相同的结果。
Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特
别指定,
它们会以默认的打印格式将变量 arr 输出到控制台。
6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字
母开头,
如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用
(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的
public);
标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部
是可见并且
可用的(像面向对象语言中的 private )
行分隔符
在 Go 程序中,一行代表一个语句结束。
每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将
由编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分
注释
注释不会被编译,每一个包应该有相关注释。
单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。
多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。
标识符
标识符用来命名变量、类型等程序实体。
一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成
的序列,
但是第一个字符不能是数字,只能是字母或下划线。
“_” 叫作空标识符,一般用在变量声明与包的导入中,例如 Go 语言程序中,
若存在一个没有使用的变量 ,那么编译时会报错,因为 Go 语言要求存在实体
必须使用,
所以可以加_=a这样的代码,这样 Go 语言编译器会认为使用了 就不会报
错了, 实际上并没有对变量 a 做任何操作 。程序初始化后 标识符就会被释放
标识符以字母 (大小写均可)或下画线开头,后面可以是多个字母、下画线和
数字。 Go 语言不许在标识符中使用标点符号,例如@、$、%等一系列符号
虽然上面说大小写字母均可,但 Go 语言是 种区分大小写的编程语言 ,所以
Test
test Go 言程序中表示的是两个不同的标识符
关键字:
3、Go程序执行命令
Go语言是编译型的静态语言,所以在运行Go语言程序之前,先要将其编译成二进制的可执行文件。
一般在编辑器中写Go语言代码,然后通过Go语言提供的go build或者go run命令对Go
语言程序进行编译:
go build命令用来启动编译,它可以将Go语言程序与相关依赖编译成一个可执行文件
,其语法格式如下。
go build fileName
其中 fileName 为所需要的参数,可以是一个或者多个 Go 源文件名(当有多个参数
时需要使用空格将
两个相邻的参数隔开),也可以省略不写。
使用 go build 命令进行编译时,目标文件只编译不执行,不同参数的执行结果也是不同的。
1) 当参数不为空时
如果 fileName 为同一 main 包下的所有源文件名(可能有一个或者多个),编译器将生成一个与第一个
fileName 同名的可执行文件(如执行go build abc.go def.go ...会生成一个 abc.exe
文件);
如果 fileName 为非 main 包下的源文件名,编译器将只对该包进行语法检查,不生
成可执行文件。
如果需要指定输出可执行文件名,可以使用-o参数,参见下面的例子:
go build -o myexec main.go lib.go
2) 当参数为空时
如果当前目录下存在 main 包,则会生成一个与当前目录名同名的“目录名.exe”可执
行文件(如在 hello
目录中执行go build命令时,会生成 hello.exe 文件);如果不存在 main 包,则只对当前目录下的程序
源码进行语法检查,不会生成可执行文件,比如当前目录下有lib.go 和 main.go 两个文件,如果进行
go build 在编译开始时,会搜索当前目录的 go 源码,go build 会找到 lib.go 和
main.go 两个文件。
编译这两个文件后,生成当前目录名的可执行文件并放置于当前目录下。
案例: main.go和 lib.go 两个文件在同一个文件夹(gobuild)
main.go代码如下:
1/6package main
import (
"fmt"
)
func main() {
pkgFunc() //外部函数调用
fmt.Println("hello worlds")
}
lib.go代码如下:
package main
import (
"fmt"
)
func pkgFunc() {
fmt.Println("call pakFunc")
}
输入编译命令行如下:
$ go build main.go lib.go
$ ls
lib.go main main.go
$ ./main
call pkgFunc
hello world
另一种:
$ go build -o myexec main.go lib.go
$ ls
lib.go main.go myexec
$ ./myexec
call pkgFunc
hello world
go run 命令
除了使用go build命令外,Go语言还为我们提供了go run命令,go run命令将编译和执
行指令合二为一,
会在编译之后立即执行Go语言程序,但是不会生成可执行文件。
2/6go run命令的语法格式如下:
go run fileName
其中 fileName 为所需要的参数,参数必须是同一 main 包下的所有源文件名,并且
不能为空。
比如:
go run demo.go
Hello World!
可以看到第 1 行的go run命令执行后,直接在第 2 行输出了程序的运行结果。
案例: hello.go 代码如下
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("args:", os.Args)
}
$go run hello.go --filename xxx.go
go install 命令
命令格式:go install [可选参数] 。
命令作用:编译并安装源文件、软件包,即把编译后的文件(可执行二进制文件)安装
到指定的目录中。
特殊说明:将编译后的文件(可执行二进制文件、归档文件等)安装到指定的目录中。
若设置了环境变量 GOBIN ,则把二进制可执行文件移到该目录。
若禁用 Go modules 则放到 $GOPATH/pkg/$GOOS_$GOARCH下。
export GO111MODULE="off"
sudo chmod 0777 /usr/local/bin
go install -x main.go
输出:
...
3/6mkdir -p /Users/ucwords/go/bin/
...
mv $WORK/b001/exe/a.out /Users/ucwords/go/bin/目标目录(go modules的目
录名)
rm -r $WORK/b001/
如果有说 GOBIN没设置则,要用如下指令指定:
临时: export GOBIN="/usr/local/bin" #该路径是属于 echo $PATH 中的任意目
录
永久:
sudo vim ~/.bashrc 在文件末尾添加如下两行数据。
export GOBIN=/usr/local/bin
保存退出,在终端中执行如下命令,使配置生效。
source ~/.bashrc
验证:
go env 可以查看 当前设置是否生效
demo 直接执行,看程序效果能否出现
删除:
sudo rm /usr/local/bin/demo
=================================================================
go build+包
一个文件夹(goinstall)里有一个文件(main.go)和一个文件夹(mypkg)。
一个文件夹(mypkg)里有一个文件(mypkg.go)。
main.go代码如下:
package main
import (
"fmt"
"goinstall/mypkg"
)
func main() {
mypkg.CustomPkgFunc()
fmt.Println("hello world")
4/6}
mypkg.go代码如下:
package mypkg //建议当前包名和所在目录一致
import "fmt"
func CustomPkgFunc() {
fmt.Println("call CustomPkgFunc")
}
执行以下命令将按包方式编译goinstall代码:
$ go build -o main goinstall
$ ls
main main.go mypkg
$ ./main
call CustomPkgFunc
hello world
如果有如下错误:
go env ⇒ gopath ==>/home/caoqb/go
cp goinstall /home/caoqb/go/src/ -r
cd /home/caoqb/go/src
go build -o main goinstall/
./main 验证效果