GO语言的进阶之路-go的程序结构以及包简介
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
B,编译
说道编译,我们不得不了解2个命令,一个是"go build",另外一个是“go install”。
前者大家应该都很熟悉,因为我在上一篇(http://www.cnblogs.com/yinzhengjie/p/6482675.html)关于GO的博客中用"go build"命令编译不同的版本,但是在这里我们还是要演示一下go build的花式用法。
package main import (
"os"
"fmt"
) func main() {
var s,sep string
for i := 1; i < len(os.Args);i++{
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
}
myecho.go的具体内容
1.go build后加参数
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
在命令行中执行go build + [go文件],那么久会生成一个可执行的二进制文件,
'''
[root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 14:45 myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go build myecho.go
[root@yinzhengjie day2]# ll
total 1520
-rwxr-xr-x 1 root root 1551621 Jun 13 15:11 myecho
-rw-r--r-- 1 root root 165 Jun 13 14:45 myecho.go
[root@yinzhengjie day2]#
2.go build后不加参数
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
在命令行中执行:go build命令,如果不加任何参数的话,它就会把当前目录下的所有go文件统一进行编译,如果这些文件编译没有出错的话,
成功编译后会生成一个以当前目录问名字的二进制文件。
''' [root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 14:45 myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go build
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# ll
total 1520
-rwxr-xr-x 1 root root 1551621 Jun 13 15:15 day2
-rw-r--r-- 1 root root 165 Jun 13 14:45 myecho.go
[root@yinzhengjie day2]# ./day2 111 222 333
111 222 333
[root@yinzhengjie day2]#
要注意的是,以上编译出来的文件,我们可以将其放在"$GOPATH/bin目录下"这样我们就可以在任何目录下执行编译出来的那个文件名字啦,前提是你的"$PATH"设置的是OK的!
当你会用"go build"命令的话,其实"go install"就更简单了。但是首先你要知道为什么会用go install这个命令!我们在编译一个文件的时候用“go build”命令是很好使的,没有必要用“go install”这个命令,但是一个目录下有好多过go文件的话,我们应该咋办呢?这个时候用"go install"的优势就体现出来了。它会把当前目录(我们可以理解这个目录其实就是一个package)所有的go文件都进行编译。他和"go build”唯一明显的区别就是:"多做了一个mv的操作,也就是说用'go build'命令编译出来的代码最终会在当前目录下生成一个文件,而'go install'命令就会将生成的这个文件移动到$GOPATH/bin目录下。"这样方便你在任何路径下动都可以使用你编译好的文件程序。
不得不说的是,在用"go install"这个命令时,你不得不对"package"进行了解,在命令行敲击这个命令的时候你需要检查以你的环境。如果环境配置正确的话,是不会报错的!
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
'go install'和"go build”唯一明显的区别就是:"多做了一个mv的操作,也就是说用'go build'命令编译出来的代码最终会在当前目录下生成
一个文件,而'go install'命令就会将生成的这个文件移动到$GOPATH/bin目录下。这样方便你在任何路径下动都可以使用你编译好的文件程序。
''' [root@yinzhengjie day2]# go env #查看go的环境变量
GOARCH="amd64"
GOBIN="/yinzhengjie/go_file/bin" #配置的bin目录
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/yinzhengjie/go_file" #项目存放目录
GORACE=""
GOROOT="/yinzhengjie/golang/local/go" #go程序安装目录
GOTOOLDIR="/yinzhengjie/golang/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED=""
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
[root@yinzhengjie day2]#
注意,以上是查看go环境,但是这些参数具体在哪里配置呢?有很多定义系统变量的文件都可以,我用的是"~/.bash_profile"这个文件来进行编辑的,具体配置我们只需要在这个文件中添加以下几行就OK啦:
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com export GOROOT=/yinzhengjie/golang/local/go
export GOPATH=/yinzhengjie/go_file
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
export GOBIN=$GOPATH/bin
其实,要想使用“go install”命令的话,我们需要手动指定一个在$GOPATH目录下手动创建一个"src"目录。然后在这个src目录下创建你的子目录,也可以说是不同的项目,当你在这个不同的项目中使用“go install”命令时,会在$GOPATH的bin目录下自动生成一个文件,以便你全局调用这个程序文件。
1.go install后不跟参数用法
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com [root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 17:25 myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go install
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# ls
myecho.go
[root@yinzhengjie day2]# day2 111 222 333
111 222 333
[root@yinzhengjie day2]#
2.go install跟参数用法
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com [root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 17:25 myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go install myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# myecho 666 777 888
666 777 888
[root@yinzhengjie day2]#
C.运行
相比大家玩过shell的人应该都是如果想要一个脚本直接在服务器上跑起来,需要给他家执行权限,但是没有执行权限的话也要运行这个脚本,我们可以用"sh + [脚本名]"照样是可以运行的。
那么在go程序中要使得go程序跑起来我们应该如何操作呢?其实我们有两种方法,一种就是类似于shell那样,不给这个go文件添加执行权限,用"go run或者gonow"命令来运行这个脚本;还有一种方法就是用“go build”命令将这个go文件编译成一个二进制可执行文件,然后在命令行中直接运行即可。
1.go run 用法展示
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com [root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 17:25 myecho.go
[root@yinzhengjie day2]# go run myecho.go 111 222 333
111 222 333
[root@yinzhengjie day2]#
2.go build用法展示
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com [root@yinzhengjie day2]# ll
total 4
-rw-r--r-- 1 root root 165 Jun 13 17:25 myecho.go
[root@yinzhengjie day2]# go build myecho.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# ll
total 1520
-rwxr-xr-x 1 root root 1551621 Jun 13 17:38 myecho
-rw-r--r-- 1 root root 165 Jun 13 17:25 myecho.go
[root@yinzhengjie day2]# ./myecho 333 555 888
333 555 888
[root@yinzhengjie day2]#
二.package那些事
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
1.做一个项目一般不会用一个文件就搞定了,可能需要多个文件才能搞定,这个时候我们就需要引入一个概念,即package,
这个包里面可以存放多个go文件。
2.一个package只能有一个main函数;
3.同一个目录下的go文件只能是一个package(换句话说,同一个目录下go文件中的package后面的关键字必须一样。);
4.同一个package下的目录可以共享变量;同一个package下的目录可以共享函数;
5.两种package,一种是库package,一种是二进制package.二进制package使用 main 来表示,库package的名字跟go文件所
在的目录名一样. '''
1.同个目录下引用其他包的变量
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
package的一个好处就是将你的代码按照文件进行处置,不同文件完成不同的事情,
''' '''
[root@yinzhengjie myecho]# ll
total 8
-rw-r--r-- 1 root root 184 Jun 14 15:24 myecho.go
-rw-r--r-- 1 root root 48 Jun 14 15:24 name.go
[root@yinzhengjie myecho]#
[root@yinzhengjie myecho]# more name.go
package main var name string = "yinzhengjie"
[root@yinzhengjie myecho]#
[root@yinzhengjie myecho]# more myecho.go
package main import (
"os"
"fmt"
) func main() {
var s,sep string
for i := 1; i < len(os.Args);i++{
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
fmt.Println(name) #虽然在当前文件中没有定义name变量,照样可以用!
} [root@yinzhengjie myecho]#
[root@yinzhengjie myecho]# pwd
/yinzhengjie/go_file/src/day2/myecho
[root@yinzhengjie myecho]#
[root@yinzhengjie myecho]# go install
[root@yinzhengjie myecho]#
[root@yinzhengjie myecho]# myecho 666666
666666
yinzhengjie #这个是字符串。
[root@yinzhengjie myecho]# '''
2.引入自定义的package案例展示
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie golib]# pwd //模拟创建一个第三方包为"golib"包
/yinzhengjie/go_file/src/day1/golib
[root@yinzhengjie golib]#
[root@yinzhengjie golib]# ll
total 4
-rw-r--r-- 1 root root 59 Jun 15 09:48 math.go
[root@yinzhengjie golib]#
[root@yinzhengjie golib]# more math.go
package golib //这个目录下的所有package关键字后面必须都跟"golib"参数。 func Add(a int,b int) int {
return a + b
}
[root@yinzhengjie golib]#
[root@yinzhengjie testlib]# pwd
/yinzhengjie/go_file/src/day2/testlib
[root@yinzhengjie testlib]#
[root@yinzhengjie testlib]# ll
total 4
-rw-r--r-- 1 root root 94 Jun 15 09:46 import_package.go
[root@yinzhengjie testlib]#
[root@yinzhengjie testlib]# more import_package.go //创建一个脚本用于测试导入第三方库。
package main
import (
"fmt"
"day1/golib" //需要写“src”目录下的绝对路径,导入"golib"的package.
) func main(){
fmt.Println(golib.Add(100,200))
}
[root@yinzhengjie testlib]#
[root@yinzhengjie testlib]# go install
[root@yinzhengjie testlib]# testlib
300
[root@yinzhengjie testlib] '''
3.查询package说明文档
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
也许你知道通过官网查询第三方包说明文档,比如要查看os,就在浏览器的地址栏输入:"https://godoc.org/os"这个
网址你就能看到相应的说明了,但是如果这个package是你自定义的,你们公司要用你的 程序,你需要写一个说明文档供应
大家查看。这个时候我们就用到了一个比较神奇的工具,“godoc”工具可以启动服务器的一个web端口。
''' '''
[root@yinzhengjie golib]# pwd
/yinzhengjie/go_file/src/day1/golib
[root@yinzhengjie golib]#
[root@yinzhengjie golib]#
[root@yinzhengjie golib]# ll
total 4
-rw-r--r-- 1 root root 94 Jun 15 10:07 math.go
[root@yinzhengjie golib]#
[root@yinzhengjie golib]# more math.go
package golib //ADD return a + b by yinzhengjie
func Add(a int,b int) int {
return a + b
}
[root@yinzhengjie golib]#
[root@yinzhengjie ~]# godoc -http=:8000 & #表示启动本地的服务器8000端口供大家查看你自定义的package!
[1] 29084
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# ip a | grep eth | grep inet | awk '{print $2}' | awk -F "/" '{print $1}' #查看当前服务器的IP,只需要在web上输入"IP:端口"即可
172.16.3.211
[root@yinzhengjie ~]#
'''
下面我们就需要在web端输入相应的地址即可:“http://172.16.3.211:8000/doc/”
a>.点击package
b>.找到了你自定义的package,查看相关信息即可。
c>.点击你自定义的包名,查看其内容说明即可。
以上的操作是告诉我们如何在本地实现如何让大家访问,那么如何把你的代码推送到github上去呢?可以参考我的笔记:http://www.cnblogs.com/yinzhengjie/p/7017036.html。如果你需要用到第三方模块在别人的github账号的仓库里,那么我们可以先把他们的环境项目下载下来,然后在引用他们的代码。配置起来也特别简单,就两条命令的事情。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie testlib]# ll $GOPATH
total 8
drwxr-xr-x 2 root root 4096 Jun 15 14:10 bin
drwxr-xr-x 5 root root 4096 Jun 15 12:16 src
[root@yinzhengjie testlib]#
[root@yinzhengjie testlib]# go get github.com/yinzhengjie/golib #将github上的项目下载到本地的GOPATH环境变量中,
[root@yinzhengjie testlib]#
[root@yinzhengjie testlib]# ll $GOPATH
total 12
drwxr-xr-x 2 root root 4096 Jun 15 14:10 bin
drwxr-xr-x 3 root root 4096 Jun 15 14:16 pkg
drwxr-xr-x 5 root root 4096 Jun 15 12:16 src
[root@yinzhengjie testlib]#
[root@yinzhengjie src]# ll
total 12
drwxr-xr-x 4 root root 4096 Jun 15 09:40 day1
drwxr-xr-x 3 root root 4096 Jun 15 09:43 day2
drwxr-xr-x 3 root root 4096 Jun 15 12:16 github.com #多出来的项目
[root@yinzhengjie src]# pwd
/yinzhengjie/go_file/src
[root@yinzhengjie src]#
[root@yinzhengjie testlib]# more import_package.go
package main
import (
"fmt"
"github.com/yinzhengjie/golib" //我们可以导入下载后的第三方库
) func main(){
fmt.Println(golib.Add(100,200))
}
[root@yinzhengjie testlib]#
'''
好了,经过上面的案例,大家也许已经看出来Golang关于package的特点,我总结如下:
A.从package的角度来说:
1>.首先,该package必须是在GOPATH路径下;
2>.一个package可用存在多个“*.go”文件,但是每个“*.go”文件的开头第一行必须是其package + 名称(你可以理解是代码存放的目录名称)。
3>.一个package可用存在多个“*.go”文件,但是每个“*.go”文件的开头第一行必须是其package + mian 。但是要注意的是在这个目录下的所有“*.go”文件中只能存在一个main函数。
B.从调用的角度来说:
1>.调用时,需要从GOPATH路径中的src目录(你可以理解成是库的根目录)下的第一个目录开始写,直到写到包名的路径为止。
2>.调用的时候,你的代码可以在操作系统的任何路径下调用。
扩展小知识:
在一个新的服务器上GOPATH目录下新建了一个src目录,但是初次从github下载一个模块的时候,会在src目录下生成一个pkg目录,这个目录是干嘛用的呢?
答案:pkg是编译的中间产物。编译分为编译->链接的过程,“pkg”里面放的是编译的产物,二进制是链接的产物。如果干掉这个“pkg”目录后还会自动生成,具体缓存的作用。具体的信息可以问问我的大师兄和二师兄。
三.代码风格
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
1.所有的代码只有一种,gofmt的风格;
2.gofmt 不是任何人的风格,但所有人都喜欢 gofmt 的风格;
3.使用 `gofmt -w xx.go` 来格式化代码;
'''
四.命令行参数
我们以后再开发命令行工具就会少不了跟命令行参数打交道,所以这些基本的这是我们得掌握清楚。
[root@yinzhengjie day2]# pwd
/yinzhengjie/go_file/src/day2
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# ll
total 12
-rw-r--r-- 1 root root 178 Jun 15 15:41 args.go
-rw-r--r-- 1 root root 184 Jun 14 15:21 myecho.go
-rw-r--r-- 1 root root 48 Jun 14 15:21 name.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go run args.go 111 222 333
[/tmp/go-build716596169/command-line-arguments/_obj/exe/args 111 222 333]
first 111
second 222
third 333
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go build args.go
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# ./args 111 222 333
[./args 111 222 333]
first 111
second 222
third 333
[root@yinzhengjie day2]#
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# more args.go
package main import (
"fmt"
"os"
) func main() {
fmt.Println(os.Args)
fmt.Println("first",os.Args[1])
fmt.Println("second",os.Args[2])
fmt.Println("third",os.Args[3])
}
[root@yinzhengjie day2]#
命令行参数
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie day2]# more myecho.go
package main import (
"os"
"fmt"
) func main() {
var s,sep string
for i := 1; i < len(os.Args);i++{
s += sep + os.Args[i]
sep = " "
}
fmt.Println(s)
} [root@yinzhengjie day2]#
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go run myecho.go 1 22 333
1 22 333
[root@yinzhengjie day2]# '''
想必大家都用过cat命令,我们想要用cat命令去查看服务器信息,我们就可以用命令行参数帮我们简单时间一下这个功能。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie day2]# more cat.go #用go写的cat程序代码
package main import (
"io/ioutil"
"fmt"
"os"
) func main() {
var s string
for i := 1; i < len(os.Args); i++ {
s = os.Args[i]
printFile(s)
} fmt.Println("yinzhengjie")
} func printFile(name string) {
buf, err := ioutil.ReadFile(name)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf))
} [root@yinzhengjie day2]#
You have new mail in /var/spool/mail/root
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# more 111
11111111111111111111111111111
yinzhengjie
11111111111111111111111111111
[root@yinzhengjie day2]# more 2222
222222222222222222222222222
yinzhengjie
222222222222222222222222222
[root@yinzhengjie day2]# more 3333
3333333333333333333333333333
yinzhengjie
3333333333333333333333333333
[root@yinzhengjie day2]#
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go run cat.go 111 2222 3333 #执行代码运行结果如下
11111111111111111111111111111
yinzhengjie
11111111111111111111111111111 222222222222222222222222222
yinzhengjie
222222222222222222222222222 3333333333333333333333333333
yinzhengjie
3333333333333333333333333333 yinzhengjie
[root@yinzhengjie day2]# '''
五.变量声明
1.定义全局变量。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
package main //1.定义变量的风格,定义一个数字类型变量x,
var x int //2.定义变量的类型为字符串y,其值等于“yinzhengjie”
var y string = "yinzhengjie" //3.当然我们可以同时定义2个变量的类型都为自数字,不用一行一行的写
var x, y int //4.当然,如果你定义的变量类型比较多的话,也可以这么晚
var (
x int
y int
z string
) '''
2.定义局部变量
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
package main import "fmt" func main() {
x := 100
s := "yinzhengjie"
fmt.Println(x,s)
x,y := 200,300
fmt.Println(x,y)
} ''' #以上代码执行结果如下:
100 yinzhengjie
200 300
六.零值初始化
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
package main import "fmt" func main() {
var (
x int #定义是整数型变量
y float32 #定义是浮点数的变量
z string #定义是字符串的变量
p *int #定义的是指针类型的变量
q bool #定义是布尔值的变量
)
fmt.Println("x =",x)
fmt.Println("y =",y)
fmt.Println("z =",z)
fmt.Println("p =",p)
fmt.Println("q =",q)
} ''' #以上代码执行结果如下:
x = 0
y = 0
z =
p = <nil>
q = false
七.指针
//@author :yinzhengjie
//blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
//EMAIL:y1053419035@qq.com '''
指针总结如下:
1>.*T 即为类型T的指针
2>.&t 即为取变量t的地址
3>.*p 即为取指针变量所指向的内容
''' package main import "fmt" func main() {
var x int //定义x的变量的类型为int
var p *int //表示p为int类型的指针
fmt.Println(&x) //取变量x的内存地址
p = &x
fmt.Println("P==",p)
fmt.Println("*P==",*p) //表示取变量p的内容,要区别其与"*int",“*string”,"*float32"哟
} 以上代码执行结果如下:
0xc04203e1d0
P== 0xc04203e1d0
*P== 0
学习完指针和命令行参数,我们就可以简单的写一个关于echo的小脚本,我们可以进行如下的模拟实验。当然,我们需要用到flag这个package,来帮我完成这个脚本,具体内容如下:
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie day2]# more myflag.go
package main
import (
"flag"
"fmt"
"strings"
)
var sep = flag.String("s", " ", "separator") #表示用"-s"指定隔离每个参数的关键字
var newline = flag.Bool("n",false,"append newline") #表示用“-n”指定是否换行 func main() {
flag.Parse()
fmt.Print(strings.Join(flag.Args(), *sep))
if *newline {
fmt.Println()
}
}
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go run myflag.go -s % -n My name is yinzhengjie #换行结果
My%name%is%yinzhengjie
[root@yinzhengjie day2]#
[root@yinzhengjie day2]#
[root@yinzhengjie day2]# go run myflag.go -s %% My name is yinzhengjie #为换行结果
My%%name%%is%%yinzhengjie[root@yinzhengjie day2]#
[root@yinzhengjie day2]#
'''
八.作用域
关于全局作用域和局部作用域估计大家都清楚吧,这个概念很简单,不知道小伙伴自行百度一下吧,学习过其他语言的童鞋应该知道这个基础的东西,下面就让我们一起学习一下,看看Golang语言是不是也是如此呢?
/*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" var x int = 200 func localFunc() {
fmt.Println(x)
} func main() {
x := 1
localFunc() //打印数字200,因为该函数中和他同级的是全局变量x = 200
fmt.Println(x) //打印数字1,他在寻找变量的时候回从同级找,从缩进来看,都是在main函数内部的作用于,有x = 1的变量,故打印出来了
if true {
x := 100 //给x变量赋初值,也就是我们说的短变量,要注意的是它仅在局部变量使用,在全局变量使用会报错。
fmt.Println(x) //打印数字100,因为它还是会从它同级开始找,从if语句开始,然后再到main函数,再到全局变量一次向外查询。
} localFunc() //打印数字200,因为该函数中和他同级的是全局变量x = 200,道理一样,这个localFunc函数回去它同级作用域(对于该函数而已就是全局变量中)找,找到就打印,找不到就报错。
fmt.Println(x) //打印数字1,还是在它的同级作用域查找,其同级作用域就是缩进相同的变量或函数或者条件表达式等等。
}