<section class="normal markdown-section"> <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#go语言的主要特征"><b>1. </b>Go语言的主要特征</a></li><ul><li><span class="title-icon "></span><a href="#golang-简介"><b>1.1. </b>golang 简介</a></li><ul><li><span class="title-icon "></span><a href="#来历"><b>1.1.1. </b>来历</a></li><li><span class="title-icon "></span><a href="#思想"><b>1.1.2. </b>思想</a></li><li><span class="title-icon "></span><a href="#优点"><b>1.1.3. </b>优点</a></li><li><span class="title-icon "></span><a href="#go语言的主要特征:"><b>1.1.4. </b>Go语言的主要特征:</a></li><li><span class="title-icon "></span><a href="#golang文件名:"><b>1.1.5. </b>Golang文件名:</a></li><li><span class="title-icon "></span><a href="#go语言命名:"><b>1.1.6. </b>Go语言命名:</a></li><li><span class="title-icon "></span><a href="#go语言声明:"><b>1.1.7. </b>Go语言声明:</a></li><li><span class="title-icon "></span><a href="#go项目构建及编译"><b>1.1.8. </b>Go项目构建及编译</a></li><li><span class="title-icon "></span><a href="#go-编译问题"><b>1.1.9. </b>go 编译问题</a></li></ul></ul></ul></div><a href="#go语言的主要特征" id="anchorNavigationExGoTop"><i class="fa fa-arrow-up"></i></a><h1 id="go语言的主要特征"><a name="go语言的主要特征" class="anchor-navigation-ex-anchor" href="#go语言的主要特征"><i class="fa fa-link" aria-hidden="true"></i></a>1. Go语言的主要特征</h1> <h2 id="golang-简介"><a name="golang-简介" class="anchor-navigation-ex-anchor" href="#golang-简介"><i class="fa fa-link" aria-hidden="true"></i></a>1.1. golang 简介</h2> <h3 id="来历"><a name="来历" class="anchor-navigation-ex-anchor" href="#来历"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.1. 来历</h3> <p>很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。</p> <h3 id="思想"><a name="思想" class="anchor-navigation-ex-anchor" href="#思想"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.2. 思想</h3> <p>Less can be more 大道至简,小而蕴真 让事情变得复杂很容易,让事情变得简单才难 深刻的工程文化</p> <h3 id="优点"><a name="优点" class="anchor-navigation-ex-anchor" href="#优点"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.3. 优点</h3> <p>自带gc。</p> <p>静态编译,编译好后,扔服务器直接运行。</p> <p>简单的思想,没有继承,多态,类等。</p> <p>丰富的库和详细的开发文档。</p> <p>语法层支持并发,和拥有同步并发的channel类型,使并发开发变得非常方便。</p> <p>简洁的语法,提高开发效率,同时提高代码的阅读性和可维护性。</p> <p>超级简单的交叉编译,仅需更改环境变量。</p> <p>Go 语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能够快速开发应用程序。</p> <h3 id="go语言的主要特征:"><a name="go语言的主要特征:" class="anchor-navigation-ex-anchor" href="#go语言的主要特征:"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.4. Go语言的主要特征:</h3> <pre class="language-"><code> 1.自动立即回收。 2.更丰富的内置类型。 3.函数多返回值。 4.错误处理。 5.匿名函数和闭包。 6.类型和接口。 7.并发编程。 8.反射。 9.语言交互性。 </code></pre><h3 id="golang文件名:"><a name="golang文件名:" class="anchor-navigation-ex-anchor" href="#golang文件名:"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.5. Golang文件名:</h3> <pre class="language-"><code>`所有的go源码都是以 ".go" 结尾。` </code></pre><h3 id="go语言命名:"><a name="go语言命名:" class="anchor-navigation-ex-anchor" href="#go语言命名:"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.6. Go语言命名:</h3> <p>1.Go的函数、变量、常量、自定义类型、包<code>(package)</code>的命名方式遵循以下规则:</p> <pre class="language-"><code> 1)首字符可以是任意的Unicode字符或者下划线 2)剩余字符可以是Unicode字符、下划线、数字 3)字符长度不限 </code></pre><p>2.Go只有25个关键字</p> <pre class="language-"><code> break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var </code></pre><p>3.Go还有37个保留字</p> <pre class="language-"><code> Constants: true false iota nil Types: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error Functions: make len cap new append copy close delete complex real imag panic recover </code></pre><p>4.可见性:</p> <pre class="language-"><code> 1)声明在函数内部,是函数的本地值,类似private 2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect 3)声明在函数外部且首字母大写是所有包可见的全局值,类似public </code></pre><h3 id="go语言声明:"><a name="go语言声明:" class="anchor-navigation-ex-anchor" href="#go语言声明:"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.7. Go语言声明:</h3> <p>有四种主要声明方式:</p> <pre class="language-"><code> var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。 </code></pre><p>Go的程序是保存在多个.go文件中,文件的第一行就是package XXX声明,用来说明该文件属于哪个包(package),package声明下来就是import声明,再下来是类型,变量,常量,函数的声明。</p> <h3 id="go项目构建及编译"><a name="go项目构建及编译" class="anchor-navigation-ex-anchor" href="#go项目构建及编译"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.8. Go项目构建及编译</h3> <p>一个Go工程中主要包含以下三个目录:</p> <pre class="language-"><code> src:源代码文件 pkg:包文件 bin:相关bin文件 </code></pre><p>1: 建立工程文件夹 goproject</p> <p>2: 在工程文件夹中建立src,pkg,bin文件夹</p> <p>3: 在GOPATH中添加projiect路径 例 e:/goproject</p> <p>4: 如工程中有自己的包examplepackage,那在src文件夹下建立以包名命名的文件夹 例 examplepackage</p> <p>5:在src文件夹下编写主程序代码代码 goproject.go</p> <p>6:在examplepackage文件夹中编写 examplepackage.go 和 包测试文件 examplepackage_test.go</p> <p>7:编译调试包</p> <p>go build examplepackage</p> <p>go test examplepackage</p> <p>go install examplepackage</p> <p>这时在pkg文件夹中可以发现会有一个相应的操作系统文件夹如windows_386z, 在这个文件夹中会有examplepackage文件夹,在该文件中有examplepackage.a文件</p> <p>8:编译主程序</p> <p>go build goproject.go</p> <p>成功后会生成goproject.exe文件</p> <p>至此一个Go工程编辑成功。</p> <pre class="language-"><code>1.建立工程文件夹 go $ pwd /Users/***/Desktop/go 2: 在工程文件夹中建立src,pkg,bin文件夹 $ ls bin conf pkg src 3: 在GOPATH中添加projiect路径 $ go env GOPATH="/Users/liupengjie/Desktop/go" 4: 那在src文件夹下建立以自己的包 example 文件夹 $ cd src/ $ mkdir example 5:在src文件夹下编写主程序代码代码 goproject.go 6:在example文件夹中编写 example.go 和 包测试文件 example_test.go example.go 写入如下代码: package example func add(a, b int) int { return a + b } func sub(a, b int) int { return a - b } example_test.go 写入如下代码: package example import ( "testing" ) func TestAdd(t *testing.T) { r := add(2, 4) if r != 6 { t.Fatalf("add(2, 4) error, expect:%d, actual:%d", 6, r) } t.Logf("test add succ") } 7:编译调试包 $ go build example $ go test example ok example 0.013s $ go install example $ ls /Users/***/Desktop/go/pkg/ darwin_amd64 $ ls /Users/***/Desktop/go/pkg/darwin_amd64/ example.a 8:编译主程序 oproject.go 写入如下代码: package main import ( "fmt" ) func main(){ fmt.Println("go project test") } $ go build goproject.go $ ls example goproject.go goproject 成功后会生成goproject文件 至此一个Go工程编辑成功。 运行该文件: $ ./goproject go project test </code></pre><h3 id="go-编译问题"><a name="go-编译问题" class="anchor-navigation-ex-anchor" href="#go-编译问题"><i class="fa fa-link" aria-hidden="true"></i></a>1.1.9. go 编译问题</h3> <p>golang的编译使用命令 go build , go install;除非仅写一个main函数,否则还是准备好目录结构; GOPATH=工程根目录;其下应创建src,pkg,bin目录,bin目录中用于生成可执行文件,pkg目录中用于生成.a文件; golang中的import name,实际是到GOPATH中去寻找name.a, 使用时是该name.a的源码中生命的package 名字;这个在前面已经介绍过了。</p> <p>注意点:</p> <pre class="language-"><code> 1.系统编译时 go install abc_name时,系统会到GOPATH的src目录中寻找abc_name目录,然后编译其下的go文件; 2.同一个目录中所有的go文件的package声明必须相同,所以main方法要单独放一个文件,否则在eclipse和liteide中都会报错; 编译报错如下:(假设test目录中有个main.go 和mymath.go,其中main.go声明package为main,mymath.go声明packag 为test); $ go install test can't load package: package test: found packages main (main.go) and test (mymath.go) in /home/wanjm/go/src/test 报错说 不能加载package test(这是命令行的参数),因为发现了两个package,分别时main.go 和 mymath.go; 3.对于main方法,只能在bin目录下运行 go build path_tomain.go; 可以用-o参数指出输出文件名; 4.可以添加参数 go build -gcflags "-N -l" ****,可以更好的便于gdb;详细参见 http://golang.org/doc/gdb 5.gdb全局变量主一点。 如有全局变量 a;则应写为 p 'main.a';注意但引号不可少; </code></pre> </section>
标签:语言,package,特征,go,文件夹,Go,example,1.1 From: https://www.cnblogs.com/wcc98/p/16799348.html