Golang——1_语言初识

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 语言支持以下系统:

  • Linux
  • FreeBSD
  • Mac 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语言语句结尾没有分号
	/*
		这也是注释,是块注释
	*/
}

  1. 入口。go有且只有一个入口函数,main
  2. 调用函数
  3. 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


猜你喜欢

转载自blog.csdn.net/u012869599/article/details/80360327