老Java学 Go 笔录(二) 从 go 的编译开始学起

目录

  • 一.版本选择
  • 二.环境准备
  • 三.工具的选择
  • 四.第一个 hello go
    • 4.1 开发
    • 4.2 编译
    • 4.3 编译+运行
    • 4.4 直接安装
  • 五.用 go 快速搭建 webserver
  • 六.调用外部三方方法
  • 七.go vs java 的执行

前言

专栏旨在利用现有的 java 体系内容去完成 go 语言的学习.
本次行文是在 https://go.dev/doc/tutorial/getting-started 官网的手册实操以及结合 java 现有的知识内容做的记录.

一.版本选择

行文时. go 的版本已经到 1.22 .并且仍然保持每年两个版本的更新节奏.

go release version 记录:https://go.dev/doc/devel/release

学习的版本我们参考最近的几个大版本更新.

Go 1.16(2021年)
嵌入文件支持:允许将文本或二进制文件作为资源嵌入到可执行文件中.
默认启用模块:Go modules成为默认的依赖管理方式,不再需要设置环境变量.

Go 1.18(2022年)
泛型支持:引入了泛型,这是一个里程碑式的更新,允许编写更加通用的代码.
性能与工具链优化:持续的性能改进和工具链的更新,如更好的错误信息和调试支持.

从版本更新功能上看,在 1.18 版本更新了泛型功能.从语言角度来说是一次比较大的更新.从这个角度我们尽可能的去选择最新的版本.我这里选择的是 1.19 版本.

版本兼容性的问题?

Go语言的设计哲学之一是强调版本间的兼容性,特别是 Go 1 发布之后,官方引入了Go 1兼容性承诺,保证了Go 1之后的所有版本> (如Go 1.1, Go 1.2, … Go 1.x )在语言规范、库接口以及编译器行为上向后兼容.这意味着,理论上,任何遵循Go 1规范编写的代码应该能在任何 Go 1.x 版本上无修改地编译和运行.这一点对于维护大型代码库和依赖众多第三方库的项目尤为重要.
尽管如此,在Go的发展过程中,还是存在一些需要注意的兼容性细节,尤其是在大版本更新时:

  • 标准库变更:虽然核心语言特性和库接口承诺保持稳定,但在某些情况下,标准库中的函数、方法或类型可能会被弃用,或者新增功能.开发者在升级 Go 版本时,应检查是否有使用到已被弃用的 API ,并按照官方建议进行替换.这一点其实不仅仅是 Go ,其他语言也是一样.替换后尽量做好功能回归和监控.
  • 工具链变化:Go的工具链(如go fmt, go vet, go test等)和链接器在新版本中可能会有所改进或增加新功能,虽然这些改动通常不会影响已有代码的构建,但有时可能需要调整构建流程或工具配置.
  • 平台和操作系统支持:随着时间推移, Go 可能会停止对某些旧的操作系统或架构的支持,这要求在这些平台上运行 Go 应用时可能需要维持使用特定版本的 Go .
  • Cgo 和其他外部依赖:如果项目依赖于 Cgo 或其他外部库,升级 Go 版本时需要确保这些依赖也兼容新版本的 Go 环境.
  • 性能差异:虽然不是直接的兼容性问题,但不同版本的 Go 在编译器优化和垃圾回收算法等方面的改进,可能导致相同代码在不同版本上的运行性能有所不同.
    为了确保升级过程中的兼容性,推荐采取以下措施:
    • 在升级 Go 版本前,仔细阅读该版本的发布说明,了解所有的更改点.
    • 使用 go mod 管理依赖,确保依赖项也与新版本 Go 兼容.
    • 在隔离环境中测试升级后的代码,可以是通过虚拟机、 Docker 容器或其他隔离机制,确保所有测试通过后再全面迁移.
    • 监控生产环境中的性能指标,确认升级后没有引入意外的性能下降.
    • 编译器兼容问题
      在这里插入图片描述

二.环境准备

mac 环境为例.
mac 安装比较简单.如下命令直接安装最新版本

brew install go

安装指定版本

brew install go@1.22

如果要更新到最新版本

brew upgrade go

之前安装了了 1.19.2

go version

在这里插入图片描述

brew unlink go
brew link go@1.19

三.工具的选择

常见的 go 开发工具 goland , visual studio , idea .基本是都能满足日常的要求. 其中 goland ,idea 都是需要收费的.但是有你懂得的方法.想知道的可以后台摸我.有钱的尊重知识产权的大佬请直接购买无限制版.开源免费的可以直接使用 visual studio .
当然如果你原来开发 java 就是 idea.那么我还是比较推荐 idea 的.快捷键都是一样.直接无痕切换.丝滑无比.如下是各 ide 的下载直接地址.

idea: https://www.jetbrains.com/zh-cn/idea/download
visual studio :https://code.visualstudio.com/Download需要继续按照 go tools .具体可以直接 guge.摸我
goland :https://www.jetbrains.com/go/download

四.第一个 hello go

4.1 开发

package main

import "fmt"

func main() {
	fmt.Print("hello go")
}

4.2 编译

go build hellogo.go

编译成功后直接在当前代码所在根目录生成 hellogo 文件

4.3 编译+运行

go run hellogo.go

4.4 直接安装

直接安装后可以在mac 的 bin 目录下直接生成执行程序,这样当前的环境所有目录就可以直接运行了.

go install hellogo.go

Go语言中,源代码文件经过编译后会生成可执行文件.可执行文件的文件类型与操作系统相关.

Windows操作系统上,可执行文件的文件类型是.exe.

LinuxUnix操作系统上,可执行文件的文件类型是无后缀的二进制文件.

例如,如果你在Windows上编译一个名为hello.go的Go源代码文件,你将得到一个名为hello.exe的可执行文件.在Linux上编译同样的源代码文件,你将得到一个名为hello的可执行文件.

需要注意的是,Go语言也支持交叉编译,即在一种操作系统上编译生成另一种操作系统的可执行文件.例如,在Windows上可以编译生成Linux环境下可执行文件,反之亦然.所以在交叉编译的情况下,生成的可执行文件的文件类型也与目标操作系统相关.

五.用 go 快速搭建 webserver

作为一个 java 过来人.现在利用 springboot java 里面搭建一个 web 应用程序已经非常方便了.不需要单独去下载 web 容器 汤姆凯特. 也不用到处去配置 web.xml.
仅仅用 @SpringBootApplication 注解+maven tomcat 插件自动就能启动 web 应用服务了.但是如下的几行 go 的代码就能搭建一个完整的 web 容器服务还是令我惊叹.
这也太简单了.这里一切要归功 net/http 的三方包的能力.

package main

import (
	"fmt"
	_ "fmt"
	"net/http"
	_ "net/http"
)

func main() {
	http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
		fmt.Fprint(writer, "web hello go")
	})
	err := http.ListenAndServe(":8880", nil)
	if err != nil {
		return
	}

}

访问

http://127.0.0.1:8880/

在这里插入图片描述

六.调用外部三方方法

  • code
package main

import "fmt"
import "rsc.io/quote"

func main() {
	fmt.Println("hello go start")
	fmt.Println(quote.Hello())
	fmt.Println(quote.Go())
	fmt.Println("hello go end")
}

  • 遇到的问题
    • cannot find package “rsc.io/quote” 需要 init module.
go mod init hello

download rsc.io/qutoe 包.

go mod tidy

Don’t communicate by sharing memory, share memory by communicating.

不要共享内存来通信,而是通过通信来进行共享内存.
检索了一下发现这个大概是 go 语言大佬的至理名言.难不成我刚刚学习就被上课了?

这段代码主要是演示了 go 在执行外部三方过程的一些问题和执行.后续还有 go module 相关的内容.

七.go vs java 的执行

我们已经知道了 java 是解释执行的语言.他的 slogan 是一次编写到处运行(write once ,run anywhere).具体是通过 jvm (java virtual machine)来扮演的中间解释执行的角色.
相比之下在传统的编程语言中,比如C、C++,当程序被编译时,它们会被转换成特定底层硬件能够理解的代码.因此,如果我们尝试在另一台使用不同硬件的机器上运行相同的代码,
这台机器所理解的代码就会导致错误,所以你必须重新编译代码,使其能够被新硬件所理解.在这个背景下诞生了 java 的解释执行的方式,随之而来的则是被反复提及的解释执行的效率问题.

在这里插入图片描述
相比之下 Go 的编译过程省去了中间字节码的步骤.会直接编译为对应操作系统二进制文件.那问题来了 编译后的 到底是什么文件呢?

Go语言的编译过程可以分为三个主要步骤:词法分析、语法分析和代码生成.

词法分析(Lexical Analysis):编译器首先会将源代码文件转换为一系列的词法单元(tokens).词法单元是源代码中具有独立意义的最小单位,如关键字、标识符、运算符、常量等.词法分析器会根据事先定义好的词法规则,将源代码文件分割成一个个的词法单元.

语法分析(Syntax Analysis):词法分析器生成的词法单元序列会被传递给语法分析器,它会根据语法规则构建一个抽象语法树(Abstract Syntax Tree,AST).抽象语法树是一种以树状结构表示源代码结构的数据结构.语法分析器会根据语法规则验证源代码的语法正确性,并生成抽象语法树.

代码生成:一旦抽象语法树构建完成,编译器会根据抽象语法树生成目标代码.目标代码可以是机器码,也可以是字节码或中间代码,这取决于具体的编译器实现和编译目标.在Go语言中,编译器会将抽象语法树转换为平台相关的机器码,并将其保存到目标文件中.

最终,编译器会将所有源代码文件编译为目标文件,然后将目标文件链接成可执行文件或库文件.编译过程中还会进行一些优化措施,如常量折叠、无用代码消除等,以提高生成的代码的性能和效率.

Go 编译过程 #:https://draveness.me/golang/docs/part1-prerequisite/ch02-compile/golang-compile-intro/ 感觉说的挺好.可以移步

赠人玫瑰 手有余香 我是柏修 一名持续更新的晚熟程序员
期待您的点赞,关注加收藏,加个关注不迷路,感谢
您的鼓励是我更新的最大动力
↓↓↓↓↓↓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式:大端序和小端序,大端序的高位字节在低地址,小端序的高位字节在高地址。例如:对数字 65538,其4字节表示的大端序内容为00 01 00 02,小端序内容为02 00 01…

JavaScript面试 题

1.延时加载JS有哪些方式 延时加载 :async defer 例如:<script defer type"type/javascript" srcscript.js></ script> defer:等html全部解析完成,才会执行js代码,顺次执行的 async: js和html解析是同步的,不是顺次执行js脚本(谁先加载完先执行谁)2.JS数…

AI视频教程下载:零代码创建10个GPTs 和Ai Agents

你将学到什么&#xff1a; 理解GPTs的基础知识&#xff1a;掌握GPTs Agent的基础知识及其在现代AI应用中的作用。 创建自定义ChatGPT Agent&#xff1a;学习构建针对内容创作、沟通和社交媒体管理等多种任务量身定制的ChatGPT Agent。 在商业和个人项目中的实用应用&#xf…

“闻起来有股答辩的味道”,答辩到底是什么味?

“闻起来有股答辩的味道”&#xff0c;答辩到底是什么味&#xff1f; 一位名叫“小鸡全家桶”的作者虚构了这样一个学校故事&#xff0c;故事说&#xff0c;由于学生的考试试卷印刷得特别模糊&#xff0c;导致里面的插图根本看不清&#xff0c;学生感到懵逼&#xff0c;监考老…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架&#xff0c;它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口&#xff0c;而无需制定创建对象的具体类&#xff0c;工厂类…

防抖和节流的区别和举例(简要说明、形象比喻、容易理解)

1、含义&#xff1a; 在前端开发技术中&#xff0c;防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用的性能优化技术&#xff0c;主要用于处理高频事件触发&#xff0c;如用户的点击、滚动、输入等操作。 防抖&#xff08;Debounce&am…

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识&#xff0c;借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等&#xff0c;旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的&#xff1f; Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑&#xff1a; 实验内容&#xff1a; VLAN及VLAN间路由的配置&#xff0c;以太通道的配置&#xff0c;STP的根调整&#xff0c;DHCPv4的配置&#xff0c;首跳冗余HSRP的配置。 实验最终结果&#xff1a; PC可以自动获取到DHCP-Server分配的IP地址&#xff0c;实现首跳…

【MySQL精通之路】InnoDB(5)-内存结构

总目录&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池&#xff08;Buffer Pool&#xff09; 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

【Pixso如何对设计好的UI进行切片导出图片文件】

当软件UI设计好之后&#xff0c;并不是直接把设计图给开发就可以了&#xff0c;开发还会向你要各种图标的图片文件&#xff0c;这个时候就要用到”切片”功能了。 1、目的&#xff1a;把所有UI界面的图标都切下来&#xff0c;做成UI图标文件夹 2、在UI界面点击【】-【切片】-‘…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

聚恒中台系统 data.ashx SQL注入致RCE漏洞复现

0x01 产品简介 聚恒中台是山东聚恒网络技术有限公司打造的一款BPM流程管理系统,平台以低代码敏捷开发、流程协同、移动互联、软硬互联、大数据分析等前沿技术为支撑,平台包含8大引擎、16种业务组件,支持三种部署方式,四级权限控制,五大应用模式(PC、手机、PDA、工业平板…

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法

基于EBAZ4205矿板的图像处理&#xff1a;07sobel边缘检测算法 项目文件 随后会上传项目全部文件&#xff0c;和之前一样免费下载 先看效果 如上所见&#xff0c;能够提取图像的边缘&#xff0c;这个sobel边缘检测算法的阈值&#xff08;认定是否为边缘的阈值&#xff09;一样…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全&#xff1f; 猜想大部分安全从业者都会回答&#xff1a;“WAF&#xff08;Web Application Firewall,应用程序防火墙&#xff09;。”不过RASP&#xff08;Runtime Application Self-Protection&#xff0c;应用运行时自我保护&#xff09;横空出世…

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式&#xff08;Composit…

C++ 写的_string类,兼容std::string, MFC CString和 C# 的string

代码例子&#xff1a; using namespace lf; int main() { CString s1 _t("http://www.csdn.net"); _string s2 s1; CString s3 s2; _pcn(s1); _pcn(s2); _pcn(s3); return 0; } 输出&#xff1a; _Str.h /***************************************…