核心内容摘要
translategemma-12b-it使用技巧:专业翻译提示词模板
如果编程语言也有性格Go一定是那个话少、活好、下班早的同事。
引子一个关于等待的故事想象一下这个场景周五下午5点你写的Java服务突然报警——内存爆了。
你打开监控面板看到一堆OutOfMemoryError然后开始排查是哪个HashMap没有及时释放、哪个线程池配置不当…三小时后你终于定位到问题改了几行代码然后开始等待——Maven下载依赖、编译、打包、部署。
又是20分钟过去了。
而隔壁工位的Go程序员小王同样是修了个bug从改代码到部署完成只用了2分钟。
他已经在收拾东西准备下班了。
这就是Go的魅力——简单、高效、让你早点回家。
Go语言的前世今生诞生背景Google的内部革命2007年Google的三位大神——Rob Pike、Ken Thompson和Robert Griesemer——坐在一起聊天。
他们聊的话题是“为什么在Google写代码这么痛苦”当时的Google主要使用C和JavaC性能好但编译慢得让人想砸电脑据说当时Google的某些项目编译一次要45分钟Java开发效率还行但太重了一个简单的Hello World都需要一堆配置于是三位大神决定搞一门新语言目标很明确编译快像解释型语言一样快执行快接近C/C的性能写起来简单像Python一样简洁原生支持并发毕竟是2007年多核CPU已经普及2009年Go语言正式开源。
2012年Go
0发布承诺向后兼容。
名字的由来为什么叫Go官方说法是简短、好记、好打只需要按两个键。
但程序员们更喜欢另一个解释Go是围棋的英文而围棋规则简单却变化无穷——这正是Go语言的设计哲学。
小八卦Go最初的名字是Golang因为go.org这个域名被人抢注了。
虽然后来Google买回了这个域名但Golang这个称呼已经深入人心。
所以当你在网上搜索时用Golang往往能找到更多资料。
为什么要学Go
大厂的宠儿看看都有谁在用Go公司使用场景GoogleKubernetes、Docker相关工具腾讯微信后台部分服务字节跳动几乎所有后端服务阿里巴巴云原生基础设施七牛云存储服务Bilibili高并发业务Uber高性能微服务特别是字节跳动可以说是Go在国内最大的推手。
他们内部有一个说法“如果你不知道用什么语言就用Go。
”
云原生的官方语言如果你关注云原生领域会发现一个有趣的现象——几乎所有重要的云原生项目都是用Go写的Docker容器技术的开创者Kubernetes容器编排的事实标准etcd分布式键值存储Prometheus监控系统Grafana可视化平台Istio服务网格Terraform基础设施即代码为什么因为Go的设计天生适合这类场景编译成单一二进制文件部署简单交叉编译方便一次编写到处运行内存占用小适合容器环境并发性能强能处理大量连接
学习曲线平缓Go的设计哲学是**“少即是多”**。
整个语言只有25个关键字Java有50C有80语法规则简单到令人发指// 这就是一个完整的Go程序packagemainimportfmtfuncmain(){fmt.Println(Hello, World!)}没有类、没有继承、没有泛型
18之前、没有异常、没有注解…Go把很多高级特性都砍掉了留下的都是最实用的部分。
有人说Go是面向Google招聘设计的语言——因为Google每年要招聘大量应届生他们需要一门学习成本低、不容易写出bug的语言。
工资还不错来看看2024年的薪资数据国内Go开发者平均薪资
K一线城市国外Go开发者平均年薪 $140,000StackOverflow 2023调查而且Go的岗位需求还在增长特别是在云原生、微服务、区块链领域。
️ 环境搭建5分钟开始你的Go之旅方式一官方安装包推荐新手Windows访问 Go官方下载页下载go
1.
x.windows-amd
msix是小版本号双击运行一路Next打开PowerShell输入go version看到版本号就成功了macOS方式A官方安装包# 下载并安装pkg文件# 或者使用Homebrew推荐brewinstallgo方式B使用HomebrewbrewinstallgoLinux (Ubuntu/Debian)# 方式A使用apt版本可能较旧sudoaptupdatesudoaptinstallgolang-go# 方式B手动安装最新版推荐wgethttps://go.dev/dl/go
1.
21.
linux-amd
tar.gzsudorm-rf /usr/local/gosudotar-C /usr/local -xzf go
1.
21.
linux-amd
tar.gzechoexport PATH$PATH:/usr/local/go/bin~/.bashrcsource~/.bashrc方式二版本管理器推荐进阶用户如果你需要在多个Go版本之间切换推荐使用gvm或goenv# 使用gvmbash(curl-s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)gvminstallgo
1.
2
6 gvm use go
1.
2
6 --default验证安装$ go version go version go
1.
2
6 darwin/amd64 $ goenvGOPATH /Users/yourname/go配置国内镜像重要由于众所周知的原因在国内直接使用Go下载依赖会很慢。
配置镜像# 设置代理goenv-wGOPROXYhttps://goproxy.cn,direct# 验证设置goenvGOPROXY常用的国内镜像https://goproxy.cn七牛云推荐https://goproxy.iohttps://mirrors.aliyun.com/goproxy/ 第一个Go程序Hello, World!创建一个文件hello.gopackagemainimportfmtfuncmain(){fmt.Println(Hello, World!)}运行它$ go run hello.go Hello, World!代码解析packagemain// 声明这是main包Go程序的入口必须在main包importfmt// 导入fmt包用于格式化输出类似Python的print、Java的System.outfuncmain(){// main函数程序入口点fmt.Println(Hello, World!)// 打印并换行}编译成可执行文件# 编译$ go build hello.go# 查看生成的文件$ls-lh hello -rwxr-xr-x1user staff
8M Jan2810:00 hello# 运行$ ./hello Hello, World!注意到了吗一个简单的Hello World编译后只有
8MB而且是静态链接的——这意味着你可以把这个文件复制到任何相同系统的机器上直接运行不需要安装任何依赖。
交叉编译一处编写到处运行Go的交叉编译简单到令人感动# 在Mac上编译Linux版本GOOSlinuxGOARCHamd64 go build hello.go# 在Mac上编译Windows版本GOOSwindowsGOARCHamd64 go build hello.go两条命令你就得到了可以在Linux和Windows上运行的二进制文件。
不需要虚拟机不需要Docker不需要任何额外配置。
Go vs 其他语言一张图说清楚特性GoPythonJavaC编译速度⚡极快无需编译较慢很慢运行速度很快较慢快极快学习曲线平缓平缓较陡陡峭并发支持✨原生支持GIL限制需要框架手动管理部署复杂度单文件依赖环境JVM依赖动态链接内存管理GC自动GC自动GC自动手动生态丰富度成长中成熟成熟成熟Go的取舍Go做了很多反直觉的设计决定砍掉的特性❌ 类和继承 → 用组合代替❌ 异常 → 用返回值处理错误❌ 泛型
18之前→ 用接口和代码生成❌ 操作符重载 → 保持代码可读性❌ 默认参数 → 使用函数选项模式保留的特性✅ 结构体和方法✅ 接口隐式实现✅ Goroutine和Channel并发原语✅ defer延迟执行✅ 指针但没有指针运算Go的设计者相信限制选择反而能提高生产力。
当所有人都用同样的方式写代码时代码review更快、团队协作更顺畅、维护成本更低。
IDE/编辑器推荐VSCode Go扩展推荐安装VSCode搜索安装 “Go” 扩展由Go Team at Google开发按提示安装Go工具链优点免费、轻量、扩展丰富GoLandJetBrains出品专业的Go IDE功能强大但需要付费学生可免费申请。
Vim/Neovim vim-go如果你是Vim党vim-go插件提供了完整的Go开发支持。
常见错误及解决方案错误1go: go.mod file not found原因Go
16之后默认启用了Go Modules需要初始化模块。
解决go mod init your-project-name错误2cannot find package xxx原因依赖包未下载。
解决go mod tidy# 自动下载依赖错误3下载依赖超时原因网络问题。
解决goenv-wGOPROXYhttps://goproxy.cn,direct错误4declared but not used原因Go不允许声明但不使用的变量这是一个feature不是bug。
解决删除未使用的变量或者用_忽略result,_:someFunction()// 忽略第二个返回值 小试牛刀在结束本篇之前让我们写一个稍微复杂一点的程序——一个简单的猜数字游戏packagemainimport(fmtmath/randtime)funcmain(){// 初始化随机数种子rand.Seed(time.Now().UnixNano())// 生成