Golang——1

xiaoxiao2021-02-28  53

1 Go语言初识

1.1 语言简介

1.1.1语言的历史

        Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

        Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于200911月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

        Go语言(或称Golang)是云计算时代的C语言。Go语言的诞生是为了让程序员有更高效的生产效率,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go语言编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

        开发人员在为项目选择语言时,不得不在快速开发和性能之间做出选择。C和C++这类语言提供了很快速的执行速度,而Ruby和Python这类语言则擅长快速开发。Go语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。

1.1.2 语言的用途

        Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

        对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

1.1.3 语言的特点

       计算机软件经历了数十年的发展,形成了多种学术流派,有面向过程编程、面向对象编程、函数式编程、面向消息编程等,这些思想究竟孰优孰劣,众说纷纭。

        除了OOP外,近年出现了一些小众的编程哲学,Go语言对这些思想亦有所吸收。例如,Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但非常强大。

        为了保持语言的简洁和简单,按照类似的语言省略常用的功能。

        Go语言的特性有:

不支持类型继承不支持任何方法或运算符重载不支付包之间循环依赖不支持对指针运算不支持断言不支持泛型编程自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程语言交互性简洁、快速、安全并行、有趣、开源编译迅速

1.1.4 语言的优势

可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。语言层面支持并发,这个就是Go最大的特色,天生的支持并发。Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发。内置runtime,支持垃圾回收,这属于动态语言的特性之一,虽然目前来说GC(内存垃圾回收机制)不算完美,但是足以应付我们所遇到的大多数情况,特别是Go1.1之后的GC。简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因。Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。丰富的标准库。Go目前已经内置了大量的库,特别是网络库非常强大。内置强大的工具,Go目前已经内置了很多工具链,最好的应该是gofmt工具,自动格式化代码,能够让团队review变得如此的简单,代码格式一摸一样,都不一样都很困难。跨平台编译,如果你写的Go代码不包括cgo,那么就可以做到windows系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。内嵌C支持,Go里面也可以直接包含C代码,利用现有的丰富的C库。

1.1.5 语言的应用

服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很适合,例如处理日志、数据打包、虚拟机处理、文件系统等。分布式系统,数据库代理器等。网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用。内存数据库,如Google开发的groupcache,couchbase的部分组建。云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。

1.2 环境搭建

1.2.1 安装和设置

(1)在线编辑

    在学习Go语言编程之前,我们需要安装和配置好Go语言的开发环境。可以选择线上的编译器:http://tour.golang.org/welcome/1来直接执行代码。

注:由于某种原因,golang官网被国内屏蔽。你可以去 http://www.yinchengxueyuan.com/forum.php 索取。或是使用代理来访问外部网站。

(2)本地编辑

        在自己的计算机上安装开发编译环境。

        Go 语言支持以下系统:

LinuxFreeBSDMac OS X(也称为 Darwin)Window

        安装包下载地址为:https://golang.org/dl/各个系统对应的包名:

1)UNIX/Linux/Mac OS X, 和 FreeBSD 安装

        以下介绍了在UNIX/Linux/Mac OS X, 和 FreeBSD系统下使用源码安装方法:

①下载源码包:go1.10.1.linux-amd64.tar.gz

②将下载的源码包解压至  /usr/local目录

tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz

③将 /usr/local/go/bin 目录添加至PATH环境变量

export PATH=$PATH:/usr/local/go/bin 注意:MAC 系统下你可以使用 .pkg 结尾的安装包直接双击来完成安装,安装目录在 /usr/local/go/ 下。 2)Windows 系统下安装

        Windows 下可以使用 .msi 后缀(在下载列表中可以找到该文件,如go1.4.2.windows-amd64.msi)的安装包来安装。默认情况下.msi文件会安装在 C:\Go 目录下。你可以将 C:\Go\bin 目录添加到 PATH环境变量中。添加后你需要重启命令窗口才能生效。

        在cmd中输入go,如果出现如下内容,则说明安装成功。

1.2.2 标准命令概述

        Go语言中包含了大量用于处理Go语言代码的命令和工具。其中,go命令就是最常用的一个,它有许多子命令。这些子命令都拥有不同的功能,如下所示:

build:用于编译给定的代码包或Go语言源码文件及其依赖包。clean:用于清理执行其他go命令后遗留的目录和文件。doc:用于执行godoc命令以打印指定代码包。env:用于打印Go语言环境信息。fix:用于执行go tool fix命令以修正给定代码包的源码文件中包含的过时语法和代码调用。

还有:fmt、generate、get、install、list、run、test、tool、version、vet

1.2.3 学习资料

Go语言官网:http://golang.org/

go中文社区:https://studygolang.com

go中文在线文档:https://studygolang.com/pkgdoc

1.3 第一个Go程序

1.3.1 Hello World

        在Windows系统下进行安装后的测试。创建工作目录 C:\>Go_WorkSpace。 文件名: test.go,代码如下:

package main import "fmt" func main() { fmt.Println("Hello World!") } 注意:要想对中文的支持必须把文件的格式变为UTF-8编码

1.3.2 代码分析

        Go 语言的基础组成有以下几个部分: 包声明引入包函数变量语句 & 表达式注释

        接下来让我们来看下简单的代码,该代码输出了"Hello World!":

package main import "fmt" func main() { /* 打印Hello World! */ fmt.Println("Hello World!") }        让我们来看下以上程序的各个部分: 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 使用 fmt.Print("Hello world\n") 可以得到相同的结果。 Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。 //1)go语言以包作为管理单位 //2)每个文件必须先声明包 //3)程序必须有一个main包(重要) package main //属于可以执行的文件 import "fmt" //导入fmt模块实现输入输出 /* func 函数 main 主要执行函数 ()参数 {}函数体 */ //入口函数 func main() { //左括号必须和函数名同行 //打印 //"Hello,World!"打印到屏幕,Println()会自动换行 //调用函数,大部分都需要导入包 fmt.Println("Hello World!") //go语言语句结尾没有分号 /* 这也是注释,是块注释 */ }

入口。go有且只有一个入口函数,main调用函数go以包作为管理单位

1.3.3 命令行运行程序

        让我们来看下如何编写 Go 代码并执行它。步骤如下:

打开编辑器,如Goland,将以上代码添加到编辑器中。将以上代码保存为 test.go打开命令行,并进入程序文件保存的目录中,如C:\Go_WorkSpace。输入命令 go run test.go 并按回车执行代码。如果操作正确你将在屏幕上看到 "Hello World!" 字样的输出。

        使用 go 命令执行以上代码输出结果如下:

C:\Go_WorkSpace>go run test.go Hello, World!

1.4 Go程序的一般结构

// 当前程序的包名 package main // 导入其他包 import . "fmt" // 常量定义 const PI = 3.14 // 全局变量的声明和赋值 var name = "gopher" // 一般类型声明 type newType int // 结构的声明 type gopher struct{} // 接口的声明 type golang interface{} // 由main函数作为程序入口点启动 func main() { Println("Hello World!") }

Go 程序是通过 package 来组织的。只有 package 名称为 main 的包可以包含 main 函数。一个可执行程序有且仅有一个 main 包。通过 import 关键字来导入其他非 main 包。

        可以通过 import 关键字单个导入:

import "fmt" import "io"        也可以同时导入多个: import ( "fmt", "io" )

        使用 <PackageName>.<FunctionName> 调用:

package main // 为fmt起别名为fmt2 import fmt2 "fmt" func main(){ fmt2.Println("Hello world!") }

        省略调用(不建议使用):

// 调用的时候只需要Println(),而不需要fmt.Println() import . "fmt"

        前面加个点表示省略调用,那么调用该模块里面的函数,可以不用写模块名称了:

import . "fmt" func main (){ Println("Hello world!") } 通过 const 关键字来进行常量的定义。通过在函数体外部使用 var 关键字来进行全局变量的声明和赋值。通过 type 关键字来进行结构(struct)和接口(interface)的声明。通过 func 关键字来进行函数的声明。

可见性规则

        Go语言中,使用大小写来决定该常量、变量、类型、接口、结构或函数是否可以被外部包所调用。

        函数名首字母小写即为 private:

func function() {}

        函数名首字母大写即为 public:

func Function() {}

新浪微博:古老医麦

技术交流论坛:http://www.yinchengxueyuan.com/forum.php

转载请注明原文地址: https://www.6miu.com/read-2613803.html

最新回复(0)