当前位置: 首页 > news >正文

GoLang 学习(一)

Go语言基础

包和导入

在 Go 里,"包"是逻辑隔离的最小单位。

核心逻辑:

  • 每个 .go 文件第一行必须声明它属于哪个包。
  • package main:特殊的包名。只有包名为 main 的文件才能编译出可执行文件,且必须包含一个 func main( )。
  • 可见性逻辑(极其重要):Go 没有 public 或 private 关键字。
    • 首字母大写:导出(外部可访问,相当于 public)
    • 首字母小写:私有(仅包内可访问,相当于 private)
      img

扩展

如果在项目中创建了一个叫 utils 的文件夹,里面的代码声明 package utils,那么在 main.go 里就要通过 imort "project/utils" 来导入它(project 是在 go.main中定义的项目名)。

变量

tips:Go 的类型是写在变量名后面的

变量声明的三种姿势:

方式 代码示例 逻辑场景
标准声明 var name string = "liunor" 声明并显示指定类型
类型推导 var age = 25 编译器自动根据右值推断为 int
短变量声明 score := 100 最常用。只能在函数内部使用,省略var

img

常量

tips:常量在编译时就确定了值,不能被修改

核心逻辑:iota

go 的常量里有一个黑科技叫 iota。它可以实现 c++ 里 enum 的效果,但逻辑更加灵活。每次出现在 const 字段时,iota 都会重置wield0,然后每行自增 1。
img

扩展:

强类型约束:

go 不允许隐式类型转换。你不能把 int32 和 int64 直接相加,必须显式写成 int64(a) + b。

指针:

go 有指针(*int),也有取地址符(&)。但禁止指针运算(不能像 C++ 那样 ptr++)。大大降低了内存崩坏的概率,但也意味着必须通过 slice (切片)来操作连续内存。

分号:

go 的代码结尾不需要分号,编译器会自动加上。

基本类型

go 的基本类型逻辑只有一个核心点:绝对不允许隐式转换。

类型分类 具体类型 逻辑细节
整数 int8/16/32/64,uint,int int 的长度取决于操作系统
浮点数 float32,float64 go 没有double关键字,float64就是双精度
布尔 bool 只有 true 和 false,不接受0/1
字符 byte,rune byte是uint8的别名(ASCALL);rune是int32的别名(UTF-8)
字符串 string 不可变,底层是字节数组

img

复合类型:从固定到动态

这是 Go 语言与 C++ 差异最大的地方,特别是 Slice 的设计。

数组(Array)与切片(Slice)

  • 数组:长度固定,是值类型。int 和 int 是完全不同的类型。在 go 中,数组名是拷贝整个值。
  • 切片:动态数组。它是对底层数组的引用。在 llm 中,存储 token,对话历史,全部使用 Slice
    img

映射(Map)

对应 C++ 的 std::unordered_map。它是引用类型,使用前必须用 make 初始化。
img

结构体

go 没有 class,只有 struct。它是封装数据的唯一方式。

扩展:结构体标签

在处理 llm api 时,它可以告诉 JSON 解析器:go里的字段名和JSON里的key怎么对应
img

值拷贝与引用传递

  • 数组、结构体是值传递
  • Slice、Map、Channel 是引用传递(内部包含指向底层数据的指针)
  • 如果想在函数内部修改结构体,请传入指针:func modify(r *ChatResponse)。

运算符与表达式

Go 的运算符逻辑与 C++ 基本一致,但为了减少歧义,它砍掉了一些“花里胡哨”但容易出 bug 的语法。

核心逻辑差异

  • 没有前置自增/自减:只有 i++ 和 i--,没有 ++i 或 --i。
  • 自增是语句而非表达式:在 Go 里,你不能写 a = b++ 或者 if i++ > 0。i++ 必须独立成行。
  • 没有三元运算符:Go 官方认为 ? : 容易导致代码可读性变差,所以你必须老老实实用 if-else。
  • 算术运算符:+, -, *, /, %(取模)。注意整数除法的结果仍为整数。
  • 逻辑运算符:&&, ||, !(具备短路特性)。
  • 位运算符:&, |, ^, <<, >>。还有一个特殊的 位清空运算符 &^(C++ 里通常需要 & (~val))。

img

控制结构

go 的控制结构非常精简:所有括号 () 都不需要(除非是函数调用),但大括号 {} 必须强制存在且不能换行。

if 与 switch

go 允许在 if 的条件判断前执行一个简短的声明语句。这个变量的作用域仅限于该 if-else 块。
img

switch:告别 break

在 go 里,switch 默认每个 case 执行完就会退出,不需要写 break。如果你非要它执行下一个 case,需要显式写 fallthrough。
img

万能的 for

go 语言里没有 while 和 do-while。一个 for 关键字就能搞定所有循环逻辑。

三种常见的 for 逻辑:

-传统 C 风格:for i := 0; i < 10; i++ { ... }

  • While 风格:for condition
  • 无限循环:for { ... }(相当于 while(true))
  • Range 迭代(最常用):用于遍历切片、映射或字符串。
    img

函数定义与调用

go 的函数定义使用 func 关键字。最显著的区别是:类型后置。

核心语法逻辑

  • 参数类型:写在变量名后面
  • 返回值类型:写在参数列表后面
  • 可见性:首字母大写(Run)外部包可访问;首字母小写(run)仅包内访问。
    img

多返回值

这是 go 区分于 C++ 的神技。在 C++ 里你可能需要 std::pair 或传引用参数,而 go 直接原生支持返回多个值。
img
img

逻辑应用:错误处理

go 并不推崇 try-catch。其标准逻辑是:函数返回“结果”和“错误”两个值。调用者必须显式检查错误。
img

可变参数

当你不知道要传入多少个参数时使用。其底层逻辑是将这些参数包装成了一个 Slice(切片)。
img

匿名函数与闭包

匿名函数就是没有名字的函数。闭包则是指一个函数“捕获”了它外部作用域中的变量。

逻辑场景

闭包常用于创建一个带有“私有状态”的配置器或计数器,而不需要写复杂的类(Class)。
img

指针

Go 的指针是 C++ 指针的“安全阉割版”。它保留了性能(减少拷贝),但去掉了风险(防止乱指)。

核心逻辑:

  • 支持:取地址符 & 和解引用符 *。
  • 不支持:指针运算。你不能写 ptr++,也不能通过偏移量去访问内存。
  • 安全性:Go 有垃圾回收(GC),所以你不需要像 C++ 那样手动 delete。即使函数返回一个局部变量的地址,Go 的编译器也会通过“逃逸分析”把它放到堆上,不会产生野指针。
    img

方法

Go 没有类(Class),但可以为结构体(或任何自定义类型)绑定方法。这在逻辑上等同于 C++ 的成员函数

核心逻辑:接收者

  • 值接收者:方法操作的是结构体的副本,修改不会影响原对象。
  • 指针接收者:方法操作的是原对象。
    img

接口

它是非侵入式的。在 C++ 里,类必须显式 class A : public Interface;而在 Go 里,只要实现了接口要求的所有方法,你就自动实现了该接口。

核心逻辑:鸭子类型

“如果它走起来像鸭子,叫起来也像鸭子,那它就是鸭子。”
img
tips:虽然 LLM 是接口,但是它可以作为参数类型来使用,所以上面样例中AskAI 的意思是:接收一个实现了 LLM 接口的东西,叫 model

可以理解成: LLM 不是一个具体对象,而是一种“能力标准”,只要某个类型有它里面的方法(Chat(prompt string) string),它就算实现了 LLM

错误处理

Go 的哲学是:错误不是异常,而是预期内的数据。所以它没有 try-catch。

核心逻辑:

  • 函数返回一个 error 类型的值(本质上就是一个接口)
  • 调用者通过 if err != nil 来处理。
    img

defer、Panic、recover

核心逻辑:

  • defer:延迟执行。不管函数是正常返回还是发生恐慌,defer 里的代码都会在函数退出前执行
  • img
  • panic:致命错误,程序崩溃(数组越界、空指针)
  • recover:能拦住 panic,让程序不崩溃并恢复正常
    img

go 的常用包

fmt(格式化输入输出)

  • Println/Printf:输出到终端。
  • Sprintf:非常重要。格式化并返回一个字符串,但不打印。常用于拼接 API 路由或构建 Prompt。
  • Errorf:格式化并返回一个 error 类型。
    img

strings(字符串操作)

  • Contains:是否包含子串
  • Join:将 Slice 拼接成字符串(比用 + 拼接效率高得多)
  • Split:将字符串切割成 Slice
  • ReplanceAll:全量替换
    img

strconv(类型转换)

go 是强类型语言,string 和 int 之间不能直接加法。这个包专门处理 字符串与其他基本类型 的转换。

  • Atoi/Itoa:最常用的 Ascii to Int (及反向)。
  • ParseFloat/ParseBool:将字符串解析为浮点或布尔。

time(时间处理)

  • time.Now():当前时间
  • Format:奇葩的格式化逻辑。Go 不用 YYYY-MM-DD,而是用一个固定的时间点 2006-01-02 15:04:05。记住这个数字顺序:1(月) 2(日) 3(时) 4(分) 5(秒) 6(年)
  • time.Duration:表示时间段(如 5 * time.Second)
    img

math(数学运算)

包含所有标准数学函数和常量($\pi$, $e$ 等)
tip:注意:所有三角函数、开方函数都接收 float64 并返回 float64。

os(操作系统交互)

处理文件读写、环境变量、命令行参数

  • os.Args:获取命令行传入的参数(os.Args[0] 是程序路径)
  • os.Getenv:获取环境变量(读取 API_KEY 的标准方法)

io(抽象输入输出)

定义了两个接口:Reader 和 Writer。
tips:无论是读文件、读网络请求、还是读内存缓冲区,只要它实现了 Read 方法,它就是一个 Reader

json(JSON处理)

Go 的 encoding/json 包利用结构体标签(Struct Tags)实现对象与 JSON 的映射。

  • Marshal:将 Go 结构体转为 JSON 字节数组(序列化)。
  • Unmarshal:将 JSON 字节数组转为 Go 结构体(反序列化)。
    img
http://www.jsqmd.com/news/714609/

相关文章:

  • 2026年新疆乌鲁木齐、昌吉一体化污水处理设备本地化采购指南:天辉环境源头直供方案 - 年度推荐企业名录
  • 2026年喇叭零部件抓取方案解析 助力产线精细化作业 - 品牌2026
  • 2026届必备的五大降AI率工具解析与推荐
  • CPPM 考试内容及科目全解析|2026 采购供应链黄金证书,中供国培张老师精讲 - 中供国培
  • 成都市蜀宏吊装工程:成都市无尘室气垫搬运哪家好 - LYL仔仔
  • 终极指南:如何在iPhone和Mac上免费运行Windows和Linux系统
  • 昆明银行变更、工商变更、代理记账全流程对标|2026财税合规避坑方案 - 优质企业观察收录
  • 闲置百联OK卡怎么处理?最全回收平台对比推荐! - 团团收购物卡回收
  • 2025届必备的五大降重复率方案横评
  • 重庆轩亿镁办公家具:黔江区单双玻百叶隔断安装哪家好 - LYL仔仔
  • 2026年昆明代理记账与银行变更、工商变更一站式服务深度横评指南 - 优质企业观察收录
  • 2026年听书软件平台,十大排行榜避坑攻略 - 资讯焦点
  • 告别配置烦恼:用vcpkg在VS2022中一键安装SFML 2.6.0
  • 2026高效之选:专业的食品加工压滤机厂家推荐 - 品牌2025
  • 5分钟终极指南:在Zotero内一站式管理所有插件
  • Hitboxer深度解析:如何通过4种按键映射模式彻底解决游戏输入冲突
  • 睿家诚家具维修:太仓软硬包装饰定制施工公司 - LYL仔仔
  • 猫抓浏览器扩展深度解析:一站式资源嗅探与M3U8流媒体下载完整方案
  • AI 英语智能体开发流程
  • 别再只会用Ping了!用Python的Scapy库手把手教你理解SYN Flood攻击原理(附防御思路)
  • MySQL索引创建过程深度剖析
  • 03安装人工智能基础软件
  • 六西格玛黑带培训多长时间 - 众智商学院官方
  • 猫抓浏览器扩展:一站式解决网页视频音频资源下载难题
  • 科研痛点揭秘:红外压片机与XRF压片机区别大,数据差异惊人!
  • 2026管道风机行业深度选型对比|英飞风机、格林瀚克、依必安派特三家核心全解析 - 资讯焦点
  • 嵌入式开发第一步:在VMware里为Ubuntu 22.04.3 LTS做好这些基础配置(含root、换源)
  • 2026年永辉超市卡回收新趋势 - 京顺回收
  • 2026年测量精度怎么看,3家振动传感供应商对比 - 速递信息
  • 课程名称-传统-好人-的思维误区与搞钱逻辑---