前文再续,书接上回,前一篇:兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00,我们搭建起了Go lang1.18的开发运行环境,接着就可以运行第一个Go lang1.18程序了,让我们整装待发,开启Go lang1.18的处女航。

首次运行

打开Sublime 4,在任意目录下新建test.go文件:



package main // 声明 main 包

import "fmt" // 导入 fmt 包,打印字符串时需要用到

func main() {  // 声明 main 主函数入口

	fmt.Println("hello Go lang 1.18") // 打印 字符串

}

随后按快捷键组合 control + b 运行程序 (Mac平台使用cmd + b)

程序返回:

> Environment:
> GOPATH=C:/Go
> Directory: C:\Users\liuyue\www\tornado6
> Command: C:/Go/bin\go.exe run -v C:\Users\liuyue\www\tornado6\test.go
> Output:
command-line-arguments
hello go1.18
> Elapsed: 3.070s
> Result: Success

和Python或者Ruby这些解释型语言不同,Go lang和Java一样,是编译型语言,运行之前需要编译成可执行文件后才能执行,而 go run命令会编译源码,并且直接执行源码的 main() 函数,不会在当前目录留下可执行文件。

可以看到Sublime帮我们执行了go run命令,如果愿意,可以在终端直接执行编译运行命令:

C:\Users\liuyue\www\tornado6>go run test.go
hello Go lang 1.18

效果是一样的。如果需要单独编译成可执行文件,可以使用go build命令:

C:\Users\liuyue\www\tornado6>go build test.go
C:\Users\liuyue\www\tornado6>dir
test.go test.exe

代码解析

首先Go lang支持用//在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码,能够大大增强程序的可读性:

fmt.Println("Hello,Go lang1.18") // 右边的所有内容当做说明,而不是真正要执行的程序,起辅助说明作用

也支持使用/**/多行注释:

func main() {
/*
以下代码都是将信息打印在屏幕上
*/
fmt.Println("Hello Go lang 1.18") }

go run命令在编译代码时,会忽略注释的内容。如果你写的一些测试代码不想让计算机执行,那么也可以加上注释。

Go lang以package(包)作为模块管理单位,每个 Go lang源文件必须先声明它所属的包,所以我们会看到每个 Go 代码的开头都有一个 package 声明:

package main // 声明 main 包

Go lang的package与目录是对应的,它具有以下几点特性:

1.一个目录下的同级文件属于同一个package。

2.package名称可以与其所在目录名不同。

3.main 包是 Go lang程序的入口包,一个 Go 语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件,这一点沿袭了C语言的特性。

在声明了当前文件的package之后,我们也可以为程序导入需要的工具包,比如:

import "fmt" // 导入 fmt 包,打印字符串时需要用到

这一点和Python类似,你想用什么,就可以import什么,fmt 包是 Go lang 内置的系统标准库。使用它可以格式化输入输出的内容,类似的系统内置包还有 os 、io 等等。

导包的时候还有一些雕虫小技,比如:

import . "fmt" // 导入 fmt 包,打印字符串时需要用到

这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println("hello world")可以省略的写成Println("hello world")

和Python类似,包可以自己声明别名:

import f "fmt" // 导入 fmt 包,打印字符串时需要用到

别名操作的话调用包函数时前缀变成了我们的前缀,即f.Println("hello world")。

还可以在导包的时候自动初始化对象:

import _ "github.com/ziutek/mymysql/godrv"

_ 操作是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数。

但需要注意的是,导入的包里面不能含有代码中没有使用到的包,否则 Go 编译器会报编译错误,例如 imported and not used: "os",换句话说,你用到什么就导什么,不用就别导,和自助餐厅里吃多少拿多少的含义是一样的。

和Python类似,Go lang也可以使用一个 import 关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行,也就是写成下面的样子:

import(
"fmt"
"os"
)

main方法是 Go lang程序的入口方法,有点类似Python中的 if __name__ == '__main__',即程序启动后运行的第一个方法。main方法只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 方法。

同时,main方法也是自定义方法的一种,在 Go lang中,所有方法都以关键字 func开头的,定义格式如下所示:

func 函数名 (参数列表) (返回值列表){
函数体
}

需要注意的是,Go lang的写法没有那么随性,左大括号{必须和函数名称在同一行,否则会报错。

fmt.Println()方法是 fmt 包中的一个内置方法,它用来格式化输出数据,比如字符串、整数、小数等。这里我们使用 Println 函数来打印字符串。注意,Println 函数打印完成后会自动换行,ln 是 line 的缩写。

关于GOPATH工作目录

网上很多教程都是基于gopath模式来讲解,gopath目录结构如下

-- bin 存放编译后生成的二进制可执行文件

-- pkg 存放编译后生成的 .a 文件

-- src 存放项目的源代码,可以是你自己写的代码,也可以是你 go get 下载的包

将自己的包或者别人的包全部放在 $GOPATH/src 目录下进行管理的方式,我们称之为 GOPATH 模式。

但事实上是,从 go lang 1.11 开始,go env 多了个环境变量: GO111MODULE ,这里的 111,其实就是 v1.11 的版本标识,GO111MODULE 是一个开关,通过它可以开启或关闭 go mod 模式。

它有三个可选值:off、on、auto,默认值是auto。

GO111MODULE=off ,禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。

GO111MODULE=on ,启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。

GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,自动开启模块支持。

go mod 出现后,GOPATH 正在被逐步淘汰,基本没人用了。

这也解释了为什么上一篇文章中我们需要手动开启go mod:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

如果您是go lang 1.18的初学者,那么就可以忘记GOPATH,完全投入go mod的怀抱,但如果您手头还维护着低版本的go lang项目,那么就应该将GO111MODULE 置为 off。

结语

Go lang 可以被认为是次时代的C语言,进行类比的话,如果说远古时代的C语言是绝世神功六脉神剑,六脉齐发,隔空伤人,性能无敌,但是门槛太高,现代人已经无法修聚到惊世骇俗的内力来催动这种剑气绝学,那么Go lang就是这个时代的一阳指,内功心法上借鉴了六脉神剑,将内力灌注于指端,亦能隔空伤人,但是入门的门槛更低,就算没有武学基础的小白也可以进行修炼,练成之后,性能和威力却不逊于六脉神剑,具体心法如何,且听下回分解。

初窥门径代码起手,Go lang1.18入门精炼教程,由白丁入鸿儒,首次运行golang程序EP01的更多相关文章

  1. 延宕执行,妙用无穷,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中defer关键字延迟调用机制使用EP17

    先行定义,延后执行.不得不佩服Go lang设计者天才的设计,事实上,defer关键字就相当于Python中的try{ ...}except{ ...}finally{...}结构设计中的finall ...

  2. 仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16

    Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右.其中还有一些保留关键字属于"锦上添花",什么叫锦上添 ...

  3. 清源正本,鉴往知来,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中引用类型是否进行引用传递EP18

    开篇明义,Go lang中从来就不存在所谓的"引用传递",从来就只有一种变量传递方式,那就是值传递.因为引用传递的前提是存在"引用变量",但是Go lang中从 ...

  4. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...

  5. 百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12

    Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复 ...

  6. 兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00

    Go lang,为并发而生的静态语言,源于C语言又不拘泥于性能,高效却不流于古板,Python灵活,略输性能,Java严谨,稍逊风骚.君不见各大厂牌均纷纷使用Go lang对自己的高并发业务进行重构, ...

  7. 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07

    函数是基于功能或者逻辑进行聚合的可复用的代码块.将一些复杂的.冗长的代码抽离封装成多个代码片段,即函数,有助于提高代码逻辑的可读性和可维护性.不同于Python,由于 Go lang是编译型语言,编译 ...

  8. 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10

    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...

  9. 因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15

    事实上,泛型才是Go lang1.18最具特色的所在,但为什么我们一定要拖到后面才去探讨泛型?类比的话,我们可以想象一下给小学一年级的学生讲王勃的千古名篇<滕王阁序>,小学生有多大的概率可 ...

  10. 并发与并行,同步和异步,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang并发编程之GoroutineEP13

    如果说Go lang是静态语言中的皇冠,那么,Goroutine就是并发编程方式中的钻石.Goroutine是Go语言设计体系中最核心的精华,它非常轻量,一个 Goroutine 只占几 KB,并且这 ...

随机推荐

  1. Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具

    1. 前言 大家好,我是沙漠尽头的狼. Dotnet工具箱是一个纯前端的.开源和免费的工具网站,周末我参考了开源项目it-tools,对网站界面文字进行了汉化,并重新部署了网站.该网站共有10大工具分 ...

  2. redis主从同步及redis哨兵机制

    1.主从和哨兵的作用: 角色 作用 主从 1.(提供)数据副本:多一份数据副本,保证redis高可用 2.  扩展(读)性能:如容量.QPS等 哨兵 1.监控: 监控redis主库及从库运行状态: 2 ...

  3. 使用fontforge进行字体拆分

    fontforge官方网站 游戏开发为了节省内存和资源下载量,需要把字体不用的字删掉,或者拆成多个字体逐级加载,批量操作用UI就比较难搞了,用fontforge搞起来比较顺手 安装fontforge后 ...

  4. C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

    一.背景: 微软的.net core开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系统上运行,开发起来还比较麻烦.微软只让c#的控 ...

  5. 数据类型python

    type()语句的用法 运行结果

  6. NEFU OJ Problem1356 帽儿山奇怪的棋盘 题解

    帽儿山奇怪的棋盘 题目: Time Limit:1000ms | Memory Limit:65535K Description 军哥来到了帽儿山,发现有两位神人在顶上对弈.棋盘长成下图的模样: 每个 ...

  7. C# 12 Blazor入门教程

    Blazor简介 Blazor 是由Microsoft开发的一款基于.NET的开源交互式Web UI框架.Blazor使开发人员能够使用C#和HTML建立全堆栈的单页应用程序,并避免使用JavaScr ...

  8. 比较Spring Security6.X 和 Spring Security 5.X的不同

    项目使用了SpringBoot3 ,因此 SpringSecurity也相应进行了升级 版本由5.4.5升级到了6.1.5 写法上发生了很大的变化,最显著的变化之一就是对 WebSecurityCon ...

  9. Leetcode旋转图像

    上C语言代码,矩阵先转置再左右对称就是旋转图像的答案啦 void rotate(int** matrix, int matrixSize, int* matrixColSize){ int i,j,n ...

  10. 趋势指标(一)MACD指标

    MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA) ...