初识Golang,集简洁与性能与一体的语言

news2024/11/25 23:36:57

文章目录

    • 一、Go语言介绍
    • 二、Go语言特性
    • 三、Go语言用途
    • 四、开发环境搭建
    • 五、建立工作区并创建Go程序
    • 六、入口文件基本代码介绍
    • 七、go命令介绍
      • 7.1 基本命令
      • 7.2 build 与 run命令
      • 7.3 install命令介绍
    • 八、命名规范
      • 8.1 变量规范定义
      • 8.2 关键字
      • 8.3 保留字
      • 8.4 需要注意的问题

道阻且长,行则将至,行而不辍,未来可期🌟。人生是一条且漫长且充满荆棘的道路,一路上充斥着各种欲望与诱惑,不断学习,不断修炼,不悔昨日,不畏将来!
GO语言也被称为21世纪的C语言,在开发与性能效率上都占据优势(Python+C)🚀。让我们一起来了解这门语言的魅力吧,希望这篇能够带给你们或多或少的帮助!!

在这里插入图片描述

本章节开始,我们将步入Go语言的学习,希望它能够成为您的得力工具,让我们一起来了解这门编程语言的魅力所在吧。笔者将会持续更多Go语言相关内容…

一、Go语言介绍


Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。

Go是静态强类型语言,是区别于解释型语言的编译型语言

  • 静态:创建变量时必须声明类型
  • 强类型:不同类型不允许直接运算
  • 编译型:在程序运行之前首先将源代码编译成机器码(二进制)再由机器来运行

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

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


二、Go语言特性


GC、内存管理、Goroutine、编译迅速、跨平台编译

简洁、快速、安全:

Go语言的语法规则严谨,没有歧义,更没什么黑魔法变异用法。任何人写出的代码都基本一致,这使得Go语言简单易学。放弃部分“灵活”和“自由”,换来更好的维护性,这是值得的。

并发编程:

Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。

高并发是Golang语言最大的亮点

很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。


三、Go语言用途


  • 服务端开发
  • 分布式系统,微服务
  • 网络编程
  • 区块链开发
  • 内存KV数据库,例如boltDB、levelDB
  • 云平台

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

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

2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO(自举),少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

Go语言是Google公司创造的语言,也是Google主推的语言。国外如Google、AWS、Cloudflare、CoreOS等,国内如七牛、阿里、小米、京东等都已经开始大规模使用Golang开发其云计算相关产品。

有人说:GO语言之所以出名,是赶上了云时代。但为什么不能换种说法?是GO语言促使了云的发展呢?


四、开发环境搭建


Go安装包下载地址:https://golang.org/dl/

在这里插入图片描述Linux安装:


1、下载二进制包:go1.13.3.linux-amd64.tar.gz
2、将下载的二进制包解压至 /usr/local目录。

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

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

//这样在任意 位置敲 go 就可以执行
export PATH=$PATH:/usr/local/go/bin

Mac安装:


Mac下直接双击go1.16.5.darwin-amd64.pkg,一路下一步安装即可


Window安装:


Windows 下可以使用 .msi 后缀(在下载列表中可以找到该文件,如go1.16.5.windows-amd64.msi)的安装包来安装。

默认情况下 .msi 文件会安装在 C:\Go 目录下。将 C:\Go\bin 目录添加到 Path 环境变量中。添加后你需要重启命令窗口才能生效(默认已经添加了,这样在cmd窗口下敲 go 能找到该命令)


配置GOPATH和GOROOT:

GOPATH:
	代码存放路径,该目录下有三个文件夹(如果没有,要手动创建),
	windows和mac默认在用户名下的go文件夹(GOPATH="/Users/ziye/go")
	
		-src——源码(包含第三方的和自己项目的)
		-bin——编译生成的可执行程序
		-pkg——编译生成的包文件
	
GOROOT:go开发工具包的安装路径,Mac默认:/user/local/go

将GOROOT下的bin路径加入环境变量(默认已处理)这样任意位置敲 go 都能找到该命令

windows下修改在系统变量里添加Go文件的存放位置
变量名:GOPATH
变量值:C:\>GoProject

# Mac永久保存环境配置,vim ~/.bash_profile 或者 vim ~/.zprofile(根据自己终端配置来决定)
export PATH=/usr/local/go/bin:$PATH # 确保直接使用go命令能够找到编译器
export GOROOT=/usr/local/go # go编译器安装目录
export GOPATH=/Users/ziye/go # 存放项目代码,编译后等可执行文件、编译后生成的包文件
export GOBIN=/Users/ziye/go/bin # 编译后可执行文件存放目录

安装完成后在终端测试:出现反馈则说明安装成功
在这里插入图片描述

IDE推荐使用Jetbrains系列的GoLand编辑器,下载地址:https://www.jetbrains.com/go/


五、建立工作区并创建Go程序


在编写代码之前,我们首先应该建立 Go 的工作区(Workspace),在上面环境搭建时我们已经讲过了。

在 Mac 或 Linux 操作系统下,Go 工作区应该设置在 $HOME/go。所以我们要在 $HOME 目录下创建 go 目录。

而在 Windows 下,工作区应该设置在 C:\Users\用户名\go。所以请将 go 目录放置在 C:\Users\用户名

其实也可以通过设置 GOPATH 环境变量,用其他目录来作为工作区。但为了简单起见,我们采用上面提到的放置方法。

所有 Go 源文件都应该放置在工作区里的 src 目录下。请在刚添加的 go 目录下面创建目录 src。

所有 Go 项目都应该依次在 src 里面设置自己的子目录。我们在 src 里面创建一个目录 GoStudy 来放置整个 hello world 项目。

创建上述目录之后,其目录结构如下:

$GOPATH
├── bin
├── pkg
└── src # 所有Go项目存放的路径
    └── GoStudy

在我们刚刚创建的 GoStudy 目录下,在 index.go 文件里保存下面的程序。

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

创建该程序之后,其目录结构如下:

$GOPATH
├── bin
├── pkg
└── src
    └── GoStudy
        └── index.go

运行Go文件

  1. 进入GoStudy目录,通过:go run index.go来运行go文件
  2. 通过:go build index.go进行编译,运行生成的可执行文件
go run index.go

go build index.go
./index // 运行编译后的可执行文件,通常直接build后可以执行文件名于项目名一致,通过go build -o xxx 指定文件名

六、入口文件基本代码介绍


使用func main()的文件称为入口函数

package main // 程序首行,必须指明是哪个包 这里表示是main包

import "fmt" // 示导入fmt包 因为Println函数是在fmt包下,主要用于打印

// 在函数外只能声明变量,常量,类型定义等,不能写逻辑代码

func main() { //定义一个main函数 
    fmt.Println("Hello World") //输出 Hello World
}

/*

package main - 每一个 Go 文件都应该在开头进行 package name 的声明。包(Packages)用于代码的封装与重用,这里的包名称是`main`。

import "fmt" - 我们引入了 fmt 包,用于在 main 函数里面打印文本到标准输出。

func main() - main 是一个特殊的函数。整个程序就是从 main 函数开始运行的。main 函数必须放置在 main 包中。{和} 分别表示 main 函数的开始和结束部分。

fmt.Println("Hello World") - fmt 包中的 Println 函数用于把文本写入标准输出。

*/

七、go命令介绍

7.1 基本命令


直接在终端中输入 go help 即可显示所有的 go 命令以及相应命令功能简介,主要有下面这些:

  • build: 编译包和依赖
  • clean: 移除对象文件(go clean :删除编译的可执行文件)
  • doc: 显示包或者符号的文档
  • env: 打印go的环境信息
  • bug: 启动错误报告
  • fix: 运行go tool fix
  • fmt: 运行gofmt进行格式化(go fmt :自动将代码格式)
  • generate: 从processing source生成go文件
  • get: 下载并安装包和依赖(go get github.com/astaxie/beego:下载beego框架)
  • install: 编译并安装包和依赖(go install 项目名:会将go编译,并放到bin路径下)
  • list: 列出包
  • run: 编译并运行go程序
  • test: 运行测试
  • tool: 运行go提供的工具
  • version: 显示go的版本
  • vet: 运行go tool vet

7.2 build 与 run命令


就像其他静态类型语言一样,要执行 go 程序,需要先编译,然后在执行产生的可执行文件。go build 命令就是用来编译 go程序生成可执行文件的。但并不是所以的 go 程序都可以编译生成可执行文件的, 要生成可执行文件,go程序需要满足两个条件:

  • 该go程序需要属于main包
  • 在main包中必须还得包含main函数

也就是说go程序的入口就是 main.main, 即main包下的main函数,如下:

test.go

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

编译test.go文件成为可执行文件

>>> go build test.go 
>>> ./test # 运行这个可执行文件
Hello World

上面就是 go build 的基本用法,另外如果使用 go build 编译的不是一个可执行程序,而是一个包,那么将不会生成可执行文件。

go run 命令可以将上面两步并为一步执行(不会产生中间文件)。

>>> go run test.go 
Hello World

上面两个命令都是在开发中非常常用的。

此外 go clean 命令,可以用于将清除产生的可执行程序:

go clean    # 不加参数,可以删除当前目录下的所有可执行文件
go clean hello.go  # 会删除与该go文件名相同的可执行文件

7.3 install命令介绍

该命令与build命令较为类似,但其作用分为两部分:

  1. 将编译生成的可执行文件存放到bin目录下
  2. 将编译后的包文件存放到pkg目录下

包:项目下面的文件夹,用于管理不同功能的文件,起到一个分类效果

GoStudy项目里面创建文件夹,那么这个文件夹就是一个包

首先直观的来查看一下installbuild的差异,我们当前的目录结构如下:

$GOPATH
├── bin
├── pkg
└── src
    └── GoStudy
        └── index.go

那么我们在GoStudy项目里面执行go build则会将属于mian包的go文件编译成可执行文件,结果会在当前目录生成一个名称为GoStudy的可执行文件。

而使用go install则会在bin目录下面生成名称为GoStudy的可执行文件,目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
└── src
    └── GoStudy
        └── index.go

我们去到bin目录调用可执行文件结果也是相同的
在这里插入图片描述
此在我们的项目里新增一个test包,创建一个add.go文件,文件内容:

// 标注属于test包,但是我们也可以指定其它的,比如abc,但是不规范,且一个包下面的所有文件必须package保持一致
package test

func AddNum(a ,b int) int{
	return a + b
}

此时的目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
└── src
    └── GoStudy
        ├── index.go
        └── test // 包
            └── add.go

我们进入test包下,执行:go install后,目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
│   └── darwin_amd64
│       └── GoStudy // GoStudy项目的包文件
│           └── test.a
└── src
    └── GoStudy
        ├── index.go
        └── test
            └── add.go

此时我们应该能够理解,go install的命令作用是什么,首先将可执行文件存放到bin目录,其次将编译的包文件存放到pkg目录。

关于包的更多内容,我们将会在下一章节进行详细的理解。


八、命名规范

8.1 变量规范定义


Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:

1、一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线

2、大写字母和小写字母是不同的:Name和name是两个不同的变量

3、关键字和保留字都不建议用作变量名


8.2 关键字


Go语言中关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。

break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

8.3 保留字


go语言中有37个保留字,主要对应内建的常量、类型和函数

内建常量: true false iota nil

内建类型:  int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover

8.4 需要注意的问题


  1. 这些保留字并不是关键字,可以在定义中重新使用它们。在一些特殊的场景中重新定义它们也是有意义的,但是也要注意避免过度而引起语义混乱

  2. 如果一个名字是在函数内部定义,那么它就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的(必须是在函数外部定义的包级名字;包级函数名本身也是包级名字),那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。包本身的名字一般总是用小写字母

  3. 名字的长度没有逻辑限制,但是Go语言的风格是尽量使用短小的名字,对于局部变量尤其是这样;你会经常看到i之类的短名字,而不是冗长的theLoopIndex命名。通常来说,如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义

  4. 在习惯上,Go语言程序员推荐使用 驼峰式 命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔。因此,在标准库有QuoteRuneToASCII和parseRequestLine这样的函数命名,但是一般不会用quote_rune_to_ASCII和parse_request_line这样的命名。而像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml

  5. go文件的名字,建议用下划线的方式命名(参见go源码)

感谢各位阅读完本篇文章,希望我们能在一起成长的路上追随光、成为光,照亮每一个靠近你的人!我是子夜,能够给您带来好文实属荣幸。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC 爆火,浪潮信息要做大模型的数据存储大底座

AIGC 在 2023 年爆火,各类大模型层出不穷,参数动辄达到千亿数量级。这些背后,数据的类型和形式也走向复杂多样。例如大模型会采用到我们真实物理世界中的文字、视觉、音频、3D、雷达、多谱等复杂多样的不同模态信号和数据,数据则又…

【Android复习笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

利用Adobe Acrobat DC实现图片和PDF互相转换

一、图片转PDF 可以实现多张或者单张图片转PDF! 这个需要使用到Adobe Acrobat DC的文件合并功能,因为Adobe Acrobat DC的文件合并,不仅可以合并多个pdf文件,也支持合并图片文件。 如图,直接选中多张图片合成即可: 添…

微服务系列文章之 Redisson实现分布式锁(3)

一、概述 1、技术架构 项目总体技术选型 SpringBoot2.4.5 Maven3.5.4 Redisson3.5.4 lombok(插件)2、加锁方式 该项目支持 自定义注解加锁 和 常规加锁 两种模式 自定义注解加锁 DistributedLock(value"goods", leaseTime5)public String lockDecreaseStock(…

84. 求1+2+…+n

链接: 链接 题目: 求 12…n12…n,要求不能使用乘除法、forfor、whilewhile、ifif、elseelse、switchswitch、casecase 等关键字及条件判断语句 (A?B:C)(A?B:C)。 数据范围 1≤n≤500001≤n≤50000。 样例 输入:10输出&#xff1…

【MySQL】不允许你不会使用组合查询

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正&#xff0…

ASEMI-1N4007是什么二极管,1N4007是什么类型的二极管

编辑-Z 1N4007是一种常见的二极管,属于快恢复二极管(Fast Recovery Diode)的一种。它是一种高压、高电流的整流二极管,常用于电源电路中的整流器。1N4007的最大反向电压为1000V,最大正向电流为1A,具有较低…

第十七章 原理篇:Deformable DETR

参考教程: 论文:https://arxiv.org/pdf/2010.04159.pdf 源码:https://github.com/fundamentalvision/Deformable-DETR 文章目录 Deformable ConvDeformable DETR计算量MethodDeformable Attention ModuleDeformAttn计算量Multi-scale Defor…

JVM学习笔记(二)

学习黑马视频:01_什么是jvm_哔哩哔哩_bilibili 一、JVM内存结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区 程序计数器、栈、本地方法栈,都是线程私有的。堆、方法区是线程共享的区域。 1. 虚拟机栈(JVM Stacks) 1&#xff09…

avue 自定义按钮修改后触发表单自带的校验方法;avue表单提交

代码&#xff1a; <avue-form :option"option" v-model"publishForm" ref"publishForm" submit"handleSubmit"><template slot-scope"{size}" slot"menuForm"><el-button :size"size" …

LayUi之选项卡的详解(附源码讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.选项卡是什么 二.选项卡在什么时候使用…

最新软件工程毕业设计选题推荐100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

IDEA debug 断点调试技巧

1、首先看下IDEA中Debug模式下的界面&#xff1a; ① 以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ② 断点&#xff1a;在左边行号栏单击左键&#xff0c;或者快捷键Ctrl…

Git教程-廖雪峰-个人归纳更新总结

文章目录 前言Git简介&#xff1a;Git的诞生&#xff1a;集中式和分布式 安装Git&#xff1a;创建版本库时光穿梭机(*)版本回退撤销修改删除文件 远程仓库&#xff1a;添加远程仓库&#xff1a;删除远程库与本地库的链接&#xff1a; 从远程库克隆(*) 使用GitHub 前言 日常需要…

微服务系列文章之 Redisson实现分布式锁

一、高效分布式锁 当我们在设计分布式锁的时候&#xff0c;我们应该考虑分布式锁至少要满足的一些条件&#xff0c;同时考虑如何高效的设计分布式锁&#xff0c;这里我认为以下几点是必须要考虑的。 1、互斥 在分布式高并发的条件下&#xff0c;我们最需要保证&#xff0c;同…

浅谈Python+requests+pytest接口自动化测试框架的搭建

框架的设计思路 首先要明确进行接口自动化需要的步骤&#xff0c;如下图所示&#xff1a; ​然后逐步拆解需要完成的工作&#xff1a; 1&#xff09;了解分析需求&#xff1a;了解接口要实现的功能 2&#xff09;数据准备&#xff1a;根据开发文档确定接口的基本情况&#x…

SuperMap iClient3D for Cesium最短路径分析

作者&#xff1a;Mei 目录 前言实现思路实现步骤1、构建二维网络数据集1.1拓扑检查1.2线拓扑数据集处理1.3构建二维网络数据集 2、发布网络分析服务3、实现代码 前言 在交通、消防业务场景中&#xff0c;如果某地发生火灾或者交通事故&#xff0c;需要快速规划出最短抢救路线&a…

河南元宇宙创造者大赛成果展示空间“元豫宙”斩获TopDigital创新营销奖金奖

6月29日&#xff0c;在上海举行的TopDigital营销盛典上&#xff0c;河南文旅元宇宙空间“元豫宙”&#xff0c;凭借其匠心独具的创新性场景设计、美轮美奂的超写实场景呈现、新潮炫酷的沉浸式虚拟体验&#xff0c;斩获TopDigital创新营销奖虚拟场景设计组金奖。元豫宙&#xff…

2023年31个最适合博主的WordPress主题

自从我最初开始写博客以来&#xff0c;在近十年的经验中&#xff0c;我已经出于各种目的在多个博客中测试和使用了数十种不同的 WordPress 主题。 以下是我挑选的绝对最佳WordPress主题&#xff0c;专门针对不想编写一行代码的博主。 无论您是想创建个人理财博客、撰写时尚、…

项目范围管理中8个常见错误,千万别大意!

管理项目范围就像驾驶汽车&#xff0c;如果不注视前方&#xff0c;汽车就会偏离道路。同样&#xff0c;如果不控制项目范围&#xff0c;项目就会偏离正轨。管理者在尝试管理项目范围时可能会遇到很多问题&#xff0c;下面来了解一下范围管理的常见错误&#xff0c;看看如何通过…