GO语言的进阶之路-go的程序结构以及包简介

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

一.编辑,编译和运行
A,编辑  
  Go程序使用UTF-8编码的纯Unicode文本编写。大部分现代编译器都能够自动处理编码,并且某些最流行的编辑器还支持Go语言的语法高亮和自动缩进。如果你用的编辑器不支持Go语言,可以在Go语言官网的搜索框中输入编辑器的名字,看看是否有适合的插件可用。为了编辑方便,所有的Go语言关键字和操作符都使用ASCII编码字符,但是Go语言中标识符可以是任一Unicode编码字符后跟若干Unicode字符或数字,这样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,还是在它的同级作用域查找,其同级作用域就是缩进相同的变量或函数或者条件表达式等等。
}

最新文章

  1. 跨界玩AR,迪奥、Hugo Boss等知名奢侈品牌将制造AR眼镜
  2. React Native之FlexBox介绍和使用
  3. ASP.NET 控件前缀命名规范
  4. poj1703Find them, Catch them(并查集以及路径压缩)
  5. HDU4057 Rescue the Rabbit(AC自动机+状压DP)
  6. OpenJudge/Poj 1844 Sum
  7. 集群中几种session同步解决方案的比较
  8. Maximum Subarray (JAVA)
  9. Thread 线程简单例子
  10. ckplayer 项目实战
  11. 《剑指Offer》算法题——替换空格
  12. python 面对post分页爬虫
  13. Java中的五种单例模式
  14. Xamarin Forms error MSB6006: “java.exe”已退出,代码为 2 解决办法
  15. 如何遍历tabcontrol控件的所有的tabpage中的所有控件
  16. css字符串转换为类map对象及反转
  17. 让机器教人学习更有效:Becoming the Expert - Interactive Multi-Class Machine Teaching
  18. 还是PHPExcel问题
  19. django “如何”系列8:如何为模型提供初始化数据
  20. MYSQL中防止插入重复记录的解决方案(无重复值更新)

热门文章

  1. Estimating the number of receiving nodes in 802.11 networks via machine learning
  2. 搭建ssm的步骤
  3. Get filename from URL using Javascript
  4. SQLSERVER 2014 SP1 的服务器 日志文件无法收缩的处理
  5. [日常工作]vCenter下虚拟机设置与宿主机时间同步的方法
  6. hive存储、数据模型、内部表
  7. linux bin &amp; sbin different
  8. jquery 語法
  9. appium学习记录 elements默认获取第一个元素
  10. JavaScript实现两小时倒计时