【GO全栈掌握入门】

news2024/9/25 9:38:14

GO语言全栈学习咯 ~

  • 1. GO 语言简介
  • 2.语言特性
  • 3.哪些公司使用GO语言?
  • 3. 安装GO开发环境
  • 4. 学习说明:
  • 5. GO结构篇
    • 5.1 工作空间
    • 5.2 导入包
    • 5.3 组织结构
    • 5.4 依赖管理
  • 6. GO骨肉篇
  • 7.GO工具篇

1. GO 语言简介

起源于2007年,GO语言之年轻如你所见,抛弃了历史设计的包袱,从轻出发。兼具python和C/C++优点
。突出之处便是:网络编程、系统编程、并发编程、分布式编程等。
创始人: Ken Thompson、Rob Pike、Robert Griesemer(三位对计算机底层设计头顶大佬皇冠的大神)

GO是编译型语言

2.语言特性

  • 语言简单:Go 与 C99、C11 相似之处颇多,这也是Go语言被冠以“NextC”名号的重要原因
  • 并发模型:运行时用 Goroutine 运行所有的一切,包括 main.main 入口函数。
  • 内存分配: Go 选择了 tcmalloc,它本就是为并发而设计的高性能内存分配组件。
  • 垃圾回收:Go 的 1.5 版本实现并发标记,逐步引入三色标记和写屏障等等,都是为了能让垃圾回收在不影响用户逻辑的情况下更好地工作。
  • 静态链接:态链接被当作优点宣传。只须编译后的一个可执行文件,无须附加任何东西就能部署。
  • 标准库:功能完善、质量可靠的标准库为编程语言提供了充足动力。
  • 工具链:内置完整测试框架,其中包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的 pprof,这些都是保障代码能正确而稳定运行的必备利器。

3.哪些公司使用GO语言?

  1. Google:作为创造了Go语言的 google 公司,当然会力挺Go语言了。Google 有很多基于 Go 开发的开源项目,比如 kubernets,docker,大家可以参考《哪些项目使用Go语言开发》一节了解更多的Go语言开源项目。
  2. FacebookFacebook 也在使用Go语言,为此他们还专门在 Github 上建立了一个开源组织 facebookgo。大家可以通过 https://github.com/facebookgo 访问查看 facebook 开源的项目,其中最具代表性的就是著名平滑重启工具 grace。
  3. 腾讯:腾讯在 15 年就已经做了 Docker 万台规模的实践。因为腾讯主要的开发语言是 C/C++ ,所以在使用Go语言方面会方便很多,也有很多优势,不过日积月累的 C/C++ 代码很难改造,也不敢动,所以主要在新业务上尝试使用 Go。
  4. 百度:百度主要在运维方面使用到了Go语言,比如百度运维的一个 BFE 项目,主要负责前端流量的接入,其次就是百度消息通讯系统的服务器端也使用到了Go语言。
  5. 七牛云:七牛云算是国内第一家选Go语言做服务端的公司。早在 2011 年,当Go语言的语法还没完全稳定下来的情况下,七牛云就已经选择将 Go 作为存储服务端的主体语言
  6. 京东:京东云消息推送系统、云存储,以及京东商城的列表页等都是使用Go语言开发的。
  7. 小米:小米对Go语言的支持,在于运维监控系统的开源,它的官方网址是 http://open-falcon.org/。此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Go语言。
  8. 360:360 对Go语言的使用也不少,比如开源的日志搜索系统 Poseidon,大家可以通过 https://github.com/Qihoo360/poseidon 查看,还有 360 的推送团队也在使用Go语言。

3. 安装GO开发环境

  1. 下载GO SDK
  2. 安装GO开发工具GOLang(安装步骤略…)

4. 学习说明:

之前大家学习一门语言,都是从变量、类型、自定义类型等入手,再到表达式、运算符、方法等,再到面向对象这样的路径前进。这次呢,我们反其道行之,我们先对整个GO项目的结构有个了解,杀个回马枪,去接受和对比、类比学习GO语言,岂不胸有成竹,不迷路?Let 's go!

在这里插入图片描述

5. GO结构篇

5.1 工作空间

1. 工作空间讲解:

workspace/
	| 
	+ ---src/	//源码目录(包含子包在内的所有源码)
	|	  |
	|     + --server/
	| 	  | 	|
	|	  | 	+ --main.go
	|	  | 	
	|	  +--service/
	|	  		|
	|			+--user.go
	|
	+ ---bin/ 	//可执行文件安装路径,不会创建额外的子目录
	|	  |
	|	  +--server
	|
	+ ---pkg/	//包安装路径,按操作系统和平台隔离
		  |
		  + --linux_amd64
		  		|
		  		+ --service.a

2. 环境变量
GOROOT: 是Go的安装路径。GOROOT在绝大多数情况下都不需要修改
GOPATH: GOPATH是开发时的工作目录。
		保存编译后的二进制文件。
		go get和go install命令会下载go代码到GOPATH。
		import包时的搜索路径
在使用Git等版本控制工具时,建议忽略pkg、bin目录。直接在src,或具体的子包下创建代码仓库
(repository)。

5.2 导入包

1. import导入
起点是GOPATH的绝对路径
eg: import "net/http" => import /usr/local/go/src/net/http

2. 别名
import osx "github.com/apple/osx/lib"
import nix "github.com/linux/lib"
导入参数是路径,而非包名

3.四种导入方式:
import    "github.com/qyuhen/test"     默认方式:test.A
import X "github.com/qyuhen/test"     别名方式:X.A
import .  "github.com/qyuhen/test"     简便方式:A
import _  "github.com/qyuhen/test"     初始化方式: 无法引用,仅用来初始化目标包

5.3 组织结构

包(package)由一个或多个保存在同一目录下(不含子目录)的源码文件组成。包的用途类似名字
空间(namespace),是成员作用域和访问权限的边界。

包名与目录名并无关系,不要求保持一致。
go list net/...  // 查看net下所有的包

权限: 所有成员在包内均可访问。只有名称首字母大写的为可导出成员,在包外可视。
	   可通过指针转换等方式绕开该限制

初始化:包内每个源码文件都可定义一到多个初始化函数,但编译器不保证执行次序。

编译器首先确保完成所有全局变量初始化,然后才开始执行初始化函数。直到这些全部结束后,
运行时才正式进入main.main入口函数。

是不是有个疑惑呢?

  • 什么是初始化函数呢?
  1. 在Go语言中,初始化函数是指在程序执行前自动调用的特殊函数。
  2. 初始化函数没有参数和返回值,且无法手动调用。它们通常用于初始化程序的状态、执行一些必要的设置或者注册一些信息。在同一个包中可以定义多个初始化函数,它们的执行顺序是随机的。初始化函数会在程序开始执行之前自动调用,确保在程序正式运行之前进行必要的初始化操作。

内部包:Go语言内部包–控制包成员的对外暴露
总之:外部包调用外部包是可以的,只要属性是公开的;但是内部包只能在同父级目录下的子包引入,其他包是不能引入的。

5.4 依赖管理

这个是非常重要的,否则可能会导致项目编译失败。
走过岁月,仍发现,一个优秀的产品不是一蹴而就的。

在这里插入图片描述

  1. 模块与包:
    关系如:集合与元素的关系。模块包含多个包。

  2. 包的分类:
    标准包:随源码发布的
    第三方包:第三方提供的,如github

    匿名包: 只导入而不使用的包。通常情况下,我们只是想使用导入包产生的副作用,即引用包级别的变量、常量、结构体、接口等,以及执行导入包的init()函数。
    内部包: 项目内部的包,位于项目目录下。

  3. go Modules 的命令

go mod download: 下载 go.mod 文件中记录的所有依赖包。
go mod edit:编辑 go.mod 文件。
go mod graph:查看现有的依赖结构。
go mod init:把当前目录初始化为一个新模块。
go mod tidy:添加丢失的模块,并移除无用的模块。默认情况下,Go 不会移除 go.mod 文件中的无
   用依赖。当依赖包不再使用了,可以使用go mod tidy命令来清除它。
go mod vendor:将所有依赖包存到当前目录下的 vendor 目录下
go mod verify:检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查下载后是否
   有修改。
go mod why:查看为什么需要依赖某模块。

6. GO骨肉篇

7.GO工具篇

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

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

相关文章

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料:https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子:https://forge.codesys.com/…

AI火灾监测报警摄像机

AI火灾监测报警摄像机,作为一种结合人工智能技术和摄像监控技术的创新产品,在火灾防控领域发挥着越来越重要的作用。这种摄像机通过先进的AI算法,能够实时监测摄像头画面,识别出火灾的特征,如火光、浓烟等。一旦检测到…

2 Spring之IOC详解

文章目录 4,IOC相关内容4.1 bean基础配置4.1.1 bean基础配置(id与class)4.1.2 bean的name属性步骤1:配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 4.1.3 bean作用范围scope配置4.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 4.1.3.2…

从零开始学习在VUE3中使用canvas(五):globalCompositeOperation(图形混合)

一、简介 通过设置混合模式来改变图像重叠区域的显示方式。 const ctx canvas.getContext("2d");ctx.globalCompositeOperation "source-over"; 二、属性介绍 source-over 这是默认的复合操作。将源图像绘制到目标图像上,保留目标图像的不透…

优化选址问题 | 模拟退火算法求解物流选址问题含Matlab源码

目录 问题代码问题 模拟退火算法(Simulated Annealing, SA)是一种概率性的全局优化算法,用于求解大规模组合优化问题。在物流选址问题中,模拟退火算法可以用来寻找成本最低、效率最高的仓库或配送中心位置。下面是一个简化的模拟退火算法求解物流选址问题的描述,并附带有…

Leetcode - 周赛389

目录 一,3083. 字符串及其反转中是否存在同一子字符串 二,3084. 统计以给定字符开头和结尾的子字符串总数 三,3085. 成为 K 特殊字符串需要删除的最少字符数 四,3086. 拾起 K 个 1 需要的最少行动次数 一,3083. 字符…

HTML5和CSS3笔记

一:网页结构(html): 1.1:页面结构: 1.2:标签类型: 1.2.1:块标签: 1.2.2:行内标签: 1.2.3:行内块标签: 1.2.4:块标签与行…

钡铼R40工业4G路由器保障智能物流仓储系统高效运行

随着物流行业的不断发展和智能化技术的广泛应用,智能物流仓储系统已成为提升物流效率、降低成本、提高服务质量的重要手段。在这样的背景下,钡铼R40工业4G路由器作为一种先进的网络通信设备,在智能物流仓储系统中扮演着关键的角色&#xff0c…

【小米汽车SU7实测】 小米汽车su7到底行不行?小米新能源轿车体验感怎么样?

小米汽车SU7是小米汽车的首款车型,定位“C级高性能生态科技轿车”,也是小米迈入新能源赛道的首次成果落地。 首先,让我们来谈谈它的性能。试驾过程中,小米SU7展现出了惊人的加速能力,0-100km/h加速仅需2.78秒&#xf…

【设计】 【数学】1622 奇妙序列

本文涉及知识点 设计 数学 LeetCode1622. 奇妙序列 请你实现三个 API append,addAll 和 multAll 来实现奇妙序列。 请实现 Fancy 类 : Fancy() 初始化一个空序列对象。 void append(val) 将整数 val 添加在序列末尾。 void addAll(inc) 将所有序列中的…

2024 年 5 个 Linux 开源数字化学习平台

与其他行业一样,教育界多年来一直在经历数字化转型的过程。随着数字化学习平台的建立,目前只要能上网,任何人都可以接受教育。 “e-learning”一词的意思是“数字化学习”,是当今最常用的词之一。 它指的是通常在互联网上进行的培…

[c++] c++ 中的一些关键字:explicit, delete, default, override, final, noexcept

1 explicit explicit 的意思是清楚的,明显的。一般用在类的构造函数中,防止隐式转换。 explicit specifier - cppreference.com 如下代码, (1) 类 A 的两个构造函数都没有使用 explicit 修饰,所以如下两行代码,隐式…

ubuntu 如何使用阿里云盘

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

网络学习:IPV6基础配置

目录 一、配置接口的全球单播地址 二、配置接口本地链路地址 三、配置接口任播地址 四、配置接口PMTU 配置静态PMTU: 配置动态PMTU: 五、接口配置IPV6地址示例: 一、配置接口的全球单播地址 全球单播地址类似于IPv4公网地址&#xff0…

postman下载汉化以及使用

【2023全网最牛教程】10分钟快速上手Postman(建议收藏)_macbook postman打开慢-CSDN博客 Postman 汉化教程(小白)配置的具体操作_postman怎么设置中文-CSDN博客 上面是两篇参考的博客 postman是一款支持http协议的接口调试与测试…

100道面试必会算法-10-K 个一组翻转链表

100道面试必会算法-10-K 个一组翻转链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点…

活动图高阶讲解-09

1 00:00:00,000 --> 00:00:04,000 上次的练习不知道大家做了没有 2 00:00:04,000 --> 00:00:07,000 没有做的话赶紧做 3 00:00:07,000 --> 00:00:09,000 把它发过来 4 00:00:09,000 --> 00:00:11,000 接下来,下一个 5 00:00:11,000 --> 00:00:16…

ARM实验 LED流水灯

.text .global _start _start: 使能GPIOE GPIOF的外设时钟 RCC_MP_AHB4ENSETR的第[4][5]设置为1即可使能GPIOE GPIOF时钟 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x3<<4) 将第4位设置为1 S…

开源项目ChatGPT-Next-Web的容器化部署(一)-- 优化Dockerfile

一、背景 最近比较火的无疑是chatgpt了&#xff0c;找到一款开源github项目&#xff0c;在其基础上修改&#xff0c;定制出适合于自身业务的系统。 它是nodejs后端项目&#xff0c;github地址是&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web&#xff0c;依…

面试算法-87-分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …