我的全栈之路-Go语言基础之Go语言概述与开发环境搭建

我的全栈之路-Go语言基础之Go语言概述与开发环境搭建

1.1 信息技术发展趋势

目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、物联网、人工智能、区块链等为代表的新兴技术三个阶段。

  • 互联网
    互联网自从20世纪90年代逐渐兴起,主要是通过网络连接了世界各地的PC机,笔记本以及背后提供数据服务的大型服务器集群。
    其中绝大多数PC机都运行着Windows,macOS操作系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。
    依靠互联网成长起来的公司有Apple、Google、Amazon、Microsoft、Baidu、Alibaba、Tencent。

  • 移动互联网
    移动互联网主要从2010开始爆发式增长,主要是通过网络连接了世界各地的移动设备(最典型的就是手机),它们绝大多数都运行着Android,iOS操作系统。
    依靠移动互联网成长起来的公司有字节跳动、蚂蚁金服、小米、美团、滴滴。

  • 大数据、云计算
    随着用户的爆发式增长,以海量数据为基础的大数据、云计算技术在Google、Amazon、Apple、Baidu、Alibaba、Tencent等大型互联网公司有着广泛的商业应用场景。

  • 物联网
    物联网会以手机作为中枢,通过物联网连接所有的智能设备,包括智能家居、汽车、电视等嵌入式设备,目前国内的小米、华为等在智能家居、电视、汽车等领域广泛布局,2019年8月华为发布了鸿蒙系统。

  • 人工智能
    人工智能(AI)作为当前最火爆的技术,国内的Baidu、Tencent、Alibaba等互联网公司逐渐根据自身的核心业务开始布局,Alibaba最早将人工智能技术布局在电商和物流领域,而Baidu开发出了对话式人工智能操作系统Dueros和自动驾驶平台Apollo,Tencent则是在游戏领域应用人工智能。

  • 区块链
    区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流、公共服务等领域,解决互联网的信任问题,目前蚂蚁金服、京东已经有大量的区块链应用落地。

1.2 浅谈计算机系统架构

1.2.1 计算机系统架构概述

计算机是一种用于高速计算的电子机器,可以进行数值运算、逻辑判断,还有存储记忆功能,且能够通过编写程序实现来自动、高速的处理数据。
计算机系统由硬件系统和软件系统组成,由软硬件共同协作完成人们日常生活和工作中的各种任务:

  • 微信聊天:微信监听键盘输入的数据,并放到内存,然后传给网卡,通过网络传递给另外一个网卡,再从网卡传递到内存,显示在显示器上。
  • QQ音乐:QQ音乐将音乐数据加载到内存上,然后写到声卡上。
  • 腾讯视频:应用程序将视频数据加载到内存,然后写到显卡上。
  • Office写文档:Office将内存中的数据写入到磁盘上。
  • Office读文档:Offcice将磁盘的数据加载到内存,然后显示在屏幕上。

1.2.2 计算机硬件系统

现在计算机是由运算器、控制器、存储器、输入设备和输出设备五大部分组成,它们各司其职,完成了数据的计算、存储、传输等常见任务。
冯诺依曼体系结构

  • CPU
    CPU也就是中央处理器,由运算器和控制器所组成,其作用是从内存中获取指令并执行后将结果返回给内存或写入磁盘和控制其他设备协同工作。

  • 内存
    内存是采用编址存储,其主要作用是作为程序的工作区,程序运行时会将指令和数据都加载到内存,内存中的数据断电后会丢失,用于临时存储小容量数据。

  • 硬盘
    硬盘是用于永久存储海量数据,按照读写性能不同分为机械硬盘和固态硬盘两大类。

  • IO设备
    IO设备用于数据的输入和输出,其中常见的输入设备包含鼠标、键盘,常见的输出设备包括声卡、显卡。
    网卡也是属于IO设备的一种,主要用于网络上的数据接收和发送。

在后期程序排查错误时除了要考虑程序本身的错误以外,还要考虑计算机硬件故障,例如内存不足,磁盘写满,网络不通等问题

每个计算机组件的IO性能也各不相同,CPU、内存、磁盘都遵循容量越大、IO性能越差的特点。
计算机IO性能汇总
在后期优化程序时需要考虑程序时间复杂度空间复杂度的问题。

1.2.3 计算机软件系统

软件的出现实现了人和计算机更好的交互,它是由开发人员采用某种编程语言(C/C++/Java等等)编写的一系列指令以及不同业务场景产生的数据组成。

通常将软件分为系统软件和应用软件

系统软件:驱动程序、操作系统、语言处理程序等都是属于系统软件。
驱动程序是硬件厂商使用编程语言(C/C++)编写的程序,在使用硬件(例如打印机、显卡等等)前必须安装对应的驱动程序。
操作系统是负责通过驱动程序管理硬件资源,同时给应用软件提供运行平台,目前主流的操作系统有Windows,Linux,macOS,Android,iOS。
语言处理程序是用于将编程语言编写的源程序编译或者解释成对应平台的机器语言。

应用软件:微信、支付宝、淘宝、Office都是属于应用软件,它们都是运行在操作系统之上的。

运行在不同操作系统之上的软件交互方式也不一样,Linux上的软件通常是使用字符界面的交互方式,运行在Windows,macOS上的软件通常是以鼠标、键盘操作的交互方式,运行在Android,iOS上的软件通常是以手势触控、语音等交互方式。

1.3 程序和指令

程序是为了完成某项任务(例如聊天、听音乐)而使用某种编程语言(例如C/C++)编写的一组指令序列。
而指令是计算机程序控制的最小单位,由操作码和操作数组成,操作码是计算机要执行什么操作,例如加减乘除操作,而操作数具体执行的对象,具体的数据以及数据的位置。
所有指令的集合称为指令系统,常见的PC机指令系统有Intel X86指令集,常见的手机指令系统有ARM,因此手机上的程序不加修改是不能直接在PC机上运行,因为不同的指令集是不兼容的。

那么计算机是如何处理程序的?
根据冯诺依曼计算机结构的原理,计算机的工作流程大致如下

  1. 当用户从计算机中打开程序时(鼠标点击桌面的快捷方式图标),程序开始执行。
  2. 操作系统将程序的内容和相关的数据传送到内存中。
  3. CPU根据程序内容从内存中读取指令。
  4. CPU分析、处理指令,并为下一条指令做准备
  5. 取下一条指令并分析、处理,如此重复操作,直到执行完程序中的全部指令,最后将计算的结果放到指令指定的存储器地址中。

以网易云音乐播放音乐为例子

  1. 用户双击网易云应用程序播放音乐
  2. 网易云应用程序的指令和数据加载到内存
  3. CPU从内存中读取并分析指令然后通过操作系统调用驱动程序
  4. 驱动程序调用声卡播放音乐

1.4 计算机编程语言发展史

任何事物都是从无到有,逐步发展壮大起来的,编程语言也是一样。

计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,但是随着计算机硬件的发展,绝大多数应用场景的效率损失可以忽略不计。

  • 机器语言
    计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(Ultra SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。
  • 汇编语言
    随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别二进制的0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。
  • 高级程序设计语言
    高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。甚至是可以实现 一次编译,到处运行,这里以Java为例子:通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行。

高级语言主要分为面向过程和面向对象两种,其中典型的面向过程编程语言就是C,面向对象的编程语言有Java,C++等等。
高级语言通常都需要编译器或者是解释器将源码编译或者解释后执行。

1.5 程序的编译和解释

由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。

为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。

  • 程序编译
    开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go

  • 程序解释
    首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。

而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行之前首先被编译成Java字节码,然后在JVM虚拟机上解释运行。

1.6 计算机语言应用场景

如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜。

2019年9月编程语言排行榜Top20
2019年9月编程语言排行榜Top20
根据Tiobe排行榜得知,Java/C/Python分别排在前三名, 随后紧跟着C++,C#,JavaScript等等。
每种编程语言都有自己擅长的应用场景。

编程语言 应用场景
C 硬件驱动、操作系统、系统软件
C++ 系统软件、网络通讯、科学计算 、游戏
C# Windows应用,Web应用、游戏
Java 大型互联网应用(淘宝、天猫),Android,大数据
Go 高并发、区块链、微服务
Kotlin Android应用开发
Swift macOS,iPhone,iPad应用开发
Python 人工智能、机器学习、自动化运维、数据分析 、图形处理
JavaScript 浏览器端、服务端、PC桌面
Scala 大数据开发

那么如果你作为初学者,面对如此之多的编程语言,到底应该先从哪门语言上车呢?如果你想深入的学习其他语言和架构相关的知识之前建议熟练掌握C语言。因为C++/Java/C#等编程语言都模仿了C语言。无论哪种语言,都是实现目标的工具,而不是目标本身。

而不出意外的话,我的全栈之路系列会覆盖上述的十种编程语言,目的是实现全平台开发,带领大家一起学习,逐步成长为开发工程师。

1.7 Go语言概述

Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

2007年9月罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。

Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。并在2012年推出1.0版本,自那时候起大量的开源项目使用Go语言进行开发,例如容器领域的Docker,Kubernetes,区块链领域的Ethereum和Fabric都是使用GO语言构建的等等。

在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

Go语言被称为21世纪的C语言,有着开源、跨平台、运行速度快(相对于Java,Python),简单易学(相对于C/C++),功能强大(可嵌套C语言),语言层面支持并发等特点被广泛用于区块链开发、大数据开发、云计算开发、服务器开发、Web开发等领域。

1.8 Go语言开发环境搭建(macOS版)

1.8.1 Go语言编译器下载

在开发Go语言的程序之前,首先去官网 golang.google.cn下载Go语言的编译器,编译器的作用就是将开发人员使用Go语言针对Go编译器编写的Go程序编译成对应平台的机器指令。因为计算机无法识别开发人员编写的程序,需要借助Go编译器来将源程序编译成计算机识别的二进制机器指令。
golang官网提供了Windows,Linux,macOS版本的Go语言编译下载
golang官网
当点击Download Go后,会跳转到各个版本的Go语言编译器下载,同学们可以针对自己的操作系统选择对应的Go语言编译器版本
各个版本的Go编译器
如果是macOS可以选择下载go1.12.9.darwin-amd64.pkg文件
macOS版本Go编译器
当点击下载链接后Chrome会自动下载go编译器
go1.12.9.darwin-amd64.pkg
当下载完成以后Chrome会提示这种类型的文件可能会损害您的计算机,这里选择保留和仍然保留下载的文件
保留
任然保留

1.8.2 Go语言编译器安装

Go语言编译器下载完成之后便可以进行安装了,这里直接在Chrome浏览器中打开之前下载的安装文件go1.12.9.darwin-amd64.pkg
欢迎使用Go安装器
选择安装类型后,系统会提示输入密码,如果有TouchID,直接使用TouchID即可
安装类型
安装进行中
安装中
安装成功
安装成功
当点击关闭窗口时,系统会提示"您要将Go安装器移除到废纸篓吗?"
如果你想保留点击保留即可,否则移除到废纸篓,下次安装时去官网下载即可。

安装完成以后可以使用终端软件(例如iTerm)中输入go version查看Go编译器的版本信息
go version

1.8.3 配置GOPATH

如果想要查看Go语言所有相关的环境变量,可以使用go env命令查看
go env
其中我们需要关注的是GOPATH和GOROOT,其中GOROOT是go语言编译器的安装路径,GOPATH是开发人员编写Go程序的工作空间,也就是存放Go代码的地方,普通用户(例如liuguanglei)登录默认的值是/Users/liuguanglei/go,如果是root用户登录,默认的GOPATH是/var/root/go,这也就意味着Go编译器编译时默认会在该路径下查找Go源程序,这里通过修改/etc/profile文件实现自定义GOPATH。

首先使用su root 命令并输入密码切换到root用户下
su root

然后使用vim命令编译/etc目录下的profile文件

sh-3.2# vim /etc/profile

此时vim处于阅读模式,如果想要修改profile文件的内容,按键 "i"便可进入编辑模式
然后添加GOPATH的环境变量配置

export GOPATH=/Users/liuguanglei/Documents/workspace/go
export PATH=$PATH:$GOPATH

添加完成以后,按esc退出编辑模式,然后输入wq!保存之前的修改,此时添加的GOPATH环境变量实际上还没有生效,使用source命令让之前的修改生效即可

sh-3.2# source /etc/profile

GOPATH配置
GOPATH配置

然后无论是普通用户登录还是root用户登录,使用go env GOPATH查看环境变量都是在/Users/liuguanglei/Documents/workspace/go目录下
全局GOPATH环境变量配置

1.9 使用Visual Studio Code开发Go程序

1.9.1 macOS安装Visual Studio Code

在安装Go编译器并配置好GOPATH之后,便可以进行Go程序的开发了。
Go源程序可以使用任意的文本编辑器开发,我这里采用Visual Studio Code来开发Go程序

首先去Visual Studio Code的官网下载并安装,官网提供了各个操作系统的版本下载。
官网

下载之后将VSCode-darwin-stable.zip包解压后将Visual Studio Code拖放到“应用程序”文件夹即可使用了。

下载VisualStudio Code,macOS默认的路径为"下载"
下载

解压VSCode-darwin-stable.zip
解压
拖放Visual Studio Code到应用程序文件夹
应用程序

安装完成以后便可以从LaunchPad启动Visual Studio Code
LaunchPad
Visual Studio Code启动界面
Visual Studio Code启动界面

1.9.2 Go语言HelloWorld

在启动Visual Studio Code之后,首先打开之前的GOPATH对应的目录
Open Folder
GOPATH
然后在该目录下编写第一个Go程序:helloworld.go

package main
import "fmt"

func main(){
    fmt.Println("macOS & Go 1.12.9 & Visual Studo Code")
}

编写完成以后可以在终端上使用go build编译该程序

liuguangleideMacBook-Pro:~ liuguanglei$ cd Documents/workspace/go/
liuguangleideMacBook-Pro:go liuguanglei$ go build helloworld.go
liuguangleideMacBook-Pro:go liuguanglei$ ./helloworld
macOS & Go 1.12.9 & Visual Studo Code

go build
go build

helloworld.go编译默认生成和源文件同名的可执行文件helloworld,然后使用./helloworld就可以运行编译

也可以直接使用go run命令直接运行源文件,该命令不会生成可以执行文件helloworld

liuguangleideMacBook-Pro:go liuguanglei$ go run helloworld.go
macOS & Go 1.12.9 & Visual Studo Code

go build
go build

1.9.3 Visual Studio Code 集成Go插件

使用Visual Studio Code编写Go程序未安装插件时,源文件中编写代码没有智能提示,而且还需要通过外部的终端程序(例如iTerm)来编译运行Go程序。

首先切换到Visual Studio Code的扩展插件视图(快捷键Command+Shift+x),然后在搜索栏中搜索go插件安装即可。
搜索安装Go插件
插件安装完成之后,编写Go代码就会有智能提示了。
安装完成

而且visual studio code自带了终端,可以直接在自带的终端来编译运行Go程序。
使用插件编写Go程序,并使用自带的终端编译运行

1.10 GoLand开发Go程序(macOS版)

1.10.1 GoLand介绍

GoLand是Jetbrains公司推出专为Go开发人员构建的跨平台IDE,可以运行在Windows,Linux,macOS系统之上,除了核心Go开发之外,它还支持JavaScript,TypeScript,NodeJS,SQL,数据库,Docker,Kubernetes和Terraform。总而言之,这些功能使其完美地适用于任何任务,无论是现代Web应用程序还是DevOps工具。

GoLand为Git,GitHub和Mercurial提供开箱即用的支持。用户可安装的插件支持Perforce,ClearCase和其他插件。

GoLand丰富的生态系统包括1000多个插件,可用于根据您的特定需求定制IDE。根据您的喜好自定义,扩展和更改所有内容:从添加对Angular和Vue.js项目的支持,或获取Nyan Cat进度条,到设置完全不同的IDE主题。

1.10.2 GoLand安装

首先去官网下载GoLand
GoLand
当点击下载之后,网站会检测当前浏览器用户对应的操作系统版本,然后下载对应操作系统版本的GoLand,目前最新版本的GoLand是2019.2.1。
下载GoLand

下载完成之后便可以进行安装了,点击下载的goland-2019.2.1.dmg文件
下载完成
然后将GoLand拖放到Applications文件夹即可。
将GoLand拖放到Applications文件夹

如果想要完全卸载GoLand,可以删除如下的目录

~/Library/Preferences/
~/Library/Caches/
~/Library/Application Support/
~/Library/Logs/

1.10.3 GoLand首次启动设置

首先从启动台中启动GoLand
启动GoLand

导入GoLand设置从其他来源
如果之前安装过其他版本的GoLand,可以选择Config or installation folder,选择其他版本的GoLand配置。
我这里已经把之前安装的GoLand完全删除了,所以选择Do not import settings
Import GoLand Settings From...

因为GoLand是收费的IDE,同时也提供了30天免费试用的方式。如果经济能力允许的话,可以从指定渠道购买正版GoLand.
GoLand提供了Jetbrains Account,Activition Code和License Server三种激活方式,使用前必须激活或者选择免费试用
激活GoLand

当激活或者选择免费试用之后便会启动GoLand
GoLand激活

1.10.4 GoLand开发Go程序

当GoLand启动后,便可以使用它来编写Go程序了。

首先选择New Project创建一个项目
New Project

设置项目路径和GOROOT
设置项目路径和GOROOT

GoLand会自动创建项目
go-core

然后创建一个多级目录
多级目录
鼠标选中go-core,然后右键菜单,选择New->Directory,依次创建net/ittimeline/go/core/foundational/object

再创建Go File
创建Go File
创建helloworld.go,选择Simple Applciaiton
创建Simple Application

编写helloworld.go

package main

import "fmt"

/*
   @author liuguanglei ittimelinedotnet@gmail.com
   @version 2019/10/12  9:55 下午
   @since Go1.12.9
*/
func main() {

    fmt.Println("mac0S10.14.6 & Go1.12.9 & GoLand 2019.2.1 With Hello World")
}

程序说明

  • package main 表示定义一个包,main是可执行程序的包名,所有的Go源文件头部必须要要有一个包声明语句,Go通过包来管理命名空间
  • import "fmt"表示引用一个外部的包fmt,import可以是标准库的包,也可以使第三方或者自定义的包,fmt是标准输入输出包
  • func关键字定义一个函数,函数名为main,main代表Go程序的入口
  • fmt.Println()是fmt包中的Println函数,函数的实参是一个字符串字面量,在标准输出(即控制台终端)上输出mac0S10.14.6 & Go1.12.9 & GoLand 2019.2.1 Hello World

Go源程序特征

  • 源程序以.go为后缀
  • 源程序默认为UTF-8编码
  • 标识符区分大小写
  • 语句结尾的分号可以省略
  • 函数以func开头,函数体开头的"{"必须在函数头所在行尾部,不能单独起一行
  • 字符串字面量使用""括起来
  • 调用包里面的方法通过包名.方法名实现,例如fmt.Println
  • main函数所在的包必须是main包

运行Go程序
首次运行可以点击main方法的运行图标运行,或者鼠标右键Run运行。
后续可以点击右上角的运行图标运行。
运行程序

如果你喜欢黑色的主题,可以通过Command+,进入设置,然后在Apperance选项上设置Theme为Darcula即可。
设置主题

1.10.5 GoLand集成GitHub

为了方便项目的版本控制,可以使用GoLand集成GitHub,将代码上传至GitHub。
首先需要去GitHub官网注册一个账号,然后在GoLand中添加注册的账号信息。
找到Settings菜单,然后在搜索栏中搜索GitHub
搜索GitHub
然后输入GitHub账号
添加账号
登录成功之后会显示GitHub账号以及头像信息
GitHub账号和头像信息

在将项目提交到GitHub之前,还要添加两个文件:README.md和.gitignore,它们都位于go-core目录下,README.md用于项目描述,支持markdown语法,后期再补充项目详细描述。

README.md

# Go语言核心编程

.gitignore是项目提交至GitHub时过滤某些文件

.gitignore

# Created by .ignore support plugin (hsz.mobi)
### Go template
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out
.idea

# Dependency directories (remove the comment below to include it)
# vendor/

然后可以使用菜单VCS->Import into Version Control->Share Project on GitHub将项目上传至GitHub
将项目上传至GitHub
填写项目说明然后点击Share
填写项目说明
选择要提交的文件以及设置提交信息,然后单击Add
选择要提交的文件以及设置提交信息
此时默认会将代码提交到远程的master分支上,可以使用浏览器访问项目
go-core on github

1.11 注释

注释(Comment)是用于描述程序的文字信息,Go中的注释分为单行注释和多行注释两种

  • 单行注释:注释一行内容,使用//表示,通常在方法内使用,快捷键Command+/
  • 多行注释 注释多行内容, 使用/**/表示,通常在方法内部使用,多行注释不能嵌套,否则会发生编译错误

在日常开发中应该多写注释,便于程序后期维护,而在程序调试的过程中,也可以通过注释部分代码来调试程序,注释的内容在编译时都会删除,不会影响程序的运行结果。

加上单行注释和多行注释后,再次运行helloworld程序不会影响程序的运行结果。

package main // 表示定义一个包,main是可执行程序的包名,所有的Go源文件头部必须要要有一个包声明语句,Go通过包来管理命名空间

import "fmt" //- import "fmt"表示引用一个外部的包fmt,import可以是标准库的包,也可以使第三方或者自定义的包,fmt是标准输入输出包

/*
    func关键字定义一个函数,函数名为main,main代表Go程序的入口

*/
func main() {
    //fmt.Println()是fmt包中的Println函数,函数的实参是一个字符串字面量,在标准输出(即控制台终端)上输出mac0S10.14.6 & Go1.12.9 & GoLand 2019.2.1 Hello World
    fmt.Println("mac0S10.14.6 & Go1.12.9 & GoLand 2019.2.1 Hello World")
    
}
原文地址:https://www.cnblogs.com/ittimeline/p/11444079.html