前文再续,书接上回,前一篇:兔起鹘落全端涵盖,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. CF276C

    题目简化和分析: 属于一种贪心思维,我们想如果要使得和最大,那么就必须保证最大的数乘的次数越多越好,并且排序没有限制,快速累加每个位置出现的次数,所以应该使用线段树差分. 然后排序最大乘最大累加. S ...

  2. XX-net安装

    1.下载https://github.com/XX-net/XX-Net 2. 3. 4.运行google浏览器 5.找到安装XX-net的位置,点击即可访问google ps:校园网用户可以直接使用 ...

  3. 慎用:git reset --hard

    丧心病狂的命令:git reset --hard commit ,我以后没弄懂这个命令之前,再也不碰它了,背后凉嗖嗖的,谁敢啊. 事情的原由是我本地git commit 的时候,发现文件多了,想删掉本 ...

  4. shell 语法介绍

    大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就 ...

  5. 在Dash中更灵活地编写回调函数

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,使用Dash开发过交互式应用的朋友,想必都不会对回调函数感到 ...

  6. go 上下文:context.Context

    Go语言中的上下文(Context)是一种用于在 Goroutines 之间传递取消信号.截止时间和其他请求范围值的标准方式.context 包提供了 Context 类型和一些相关的函数,用于在并发 ...

  7. CD74HC4067高速CMOS16通道模拟多路复用器实践

    咱们在玩arduino或stm32.esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取. 这货长这 ...

  8. 从一个 Demo 说起 Dubbo3

    简介 2017年的9月份,阿里宣布重启Dubbo的开发维护,并且后续又将Dubbo捐献给了Apache,经过多年的发展已经发布到3.X版本了,Dubbo重启维护之后是否有值得我们期待的功能呢,下面就来 ...

  9. 有一种浪漫,叫接触Linux

    ​大家好,我是五月. 嵌入式开发 嵌入式开发产品必须依赖硬件和软件. 硬件一般使用51单片机,STM32.ARM,做成的产品以平板,手机,智能机器人,智能小车居多. 软件用的当然是以linux系统为蓝 ...

  10. 2023第十四届极客大挑战 — MISC WP

    Misc方向题解:来自本人 cheekin 请前往"三叶草小组Syclover"微信公众号输入flag获得flag 我的解答: 关注公众号回复就可以得到一张图片,图片隐写zsteg ...