Go语言学习day1

发布时间:2026/10/24 4:08:07

Go语言学习day1 1变量的声明1.1go的变量声明是放在变量名后面var 是 Go 里声明变量的关键字var就是“我要声明一个变量”的标记。1.完整声明 var port int var host string var timeout time.Duration //time包里的类型单位为ns 2.有初始值可以推断其类型 var port 8080 var host 127.0.0.1 3.短声明(只能在函数内部用) port : 8080 host : 127.0.0.1 time : 500*time.Millisecond //ms1.2再补充一下time包1.3零值Go 的变量声明后一定有零值不存在“未初始化”的悬空状态类型零值int0stringboolfalse指针、切片、map、channel、接口nilC 里int port;是未定义值Go 里var port int一定是0。这意味着你不需要手动初始化但也意味着忘记赋值时不会报错而是拿到零值逻辑错误更隐蔽。1.4多变量声明1.声明多个变量 var a, b, c int 2.同时赋值 d, e : 1, 2 3.变量交换值(需要中间的临时值) d, e e, d2.打括号需要跟在同一行错误写法func main() { // 编译错误 fmt.Println(hi) }编译器报错信息通常是syntax error: unexpected semicolon or newline before {。原因自动分号插入Go 编译器在每一行末尾自动插入分号规则是如果一行以标识符、数字、字符串、)、]、}、、--等结尾就在行尾加;。所以上面的代码被编译器看成func main(); // 编译器自动加了分号 { // 这里就变成孤立的代码块了 ... }正确写法func main() { fmt.Println(hi) } if port 0 { fmt.Println(open) } for i : 0; i 10; i { fmt.Println(i) }唯一例外else必须紧跟}同一行// 正确 if err ! nil { return } else { fmt.Println(ok) } // 错误else 不能另起一行 if err ! nil { return } else { // 编译错误 ... }3. 没有 while只有 forGo 的for有三种形式覆盖 C 的for、while、do-while没有 do-while用for模拟。形式一经典三段式等同 C for形式一经典三段式等同 C for go// C: for (int i 0; i 10; i) for i : 0; i 10; i { fmt.Println(i)//打印 } // 你的扫描器里 for port : start; port end; port { scanPort(target, port) }形式二只有条件等同 C while// C: while (port 100) { port } port : 1 for port 100 { port } // 无限循环等同 while(true) for { // 需要 break 退出 if done { break } }形式三for range遍历切片、map、channelports : []int{22, 80, 443, 8080} //数组 // 只要值 for _, p : range ports { fmt.Println(p) } // 要索引和值 for i, p : range ports { fmt.Printf(index%d port%d\n, i, p) } // 遍历 channel你收扫描结果时用//result是一个map for openPort : range results { fmt.Println(openPort) }range对切片返回(索引, 值)对 map 返回(键, 值)对 channel 只返回值没有索引所以for v : range ch。_是空白标识符用来丢弃不需要的返回值因为 Go 要求所有声明的变量必须被使用否则编译报错。4. 数组 vs 切片1.数组固定长度值语义var arr [3]int // 三个元素都是 0 arr[0] 1 arr[1] 2 arr[2] 3 fmt.Println(len(arr)) // 3长度是类型的一部分数组是值类型赋值和传参会复制整个数组a : [3]int{1, 2, 3} b : a // b 是 a 的副本 b[0] 100 fmt.Println(a[0]) // 1a 不受影响2.切片可变长度引用语义切片是日常使用的“动态数组”底层是一个指向数组的指针 长度 容量。// 创建方式一字面量 ports : []int{22, 80, 443} // 创建方式二make(类型, 长度, 容量) s : make([]int, 0) // 长度 0容量 0 s : make([]int, 0, 10) // 长度 0容量 10预留空间避免频繁扩容 s : make([]int, 5) // 长度 5容量 5五个元素都是 0 // 创建方式三从数组切 arr : [5]int{1, 2, 3, 4, 5} s : arr[1:4] // [2, 3, 4]左闭右开日常最常用var s []int收集结果和s : []int{...}有初始值。make([]int, 0, N)只在明确知道大概要存多少、想避免扩容时用。注意make([]int, 5)和make([]int, 0, 5)的区别a : make([]int, 5) // [0 0 0 0 0]len5可以直接 a[0] 访问 b : make([]int, 0, 5) // []len0不能 b[0]panic只能 appendmake([]int, 5)是“已经存在 5 个零值元素”不是“预留 5 个空位”。收集结果时用var s []int或make([]int, 0)不要用make([]int, N)否则 append 后会多出一堆你没想要的 0。2.1len 和 cap 的区别s : make([]int, 0, 5) fmt.Println(len(s)) // 0当前有几个元素 fmt.Println(cap(s)) // 5底层数组能装几个 s append(s, 22) fmt.Println(len(s)) // 1 fmt.Println(cap(s)) // 5没超过容量底层数组没换 s append(s, 80, 443, 8080, 3306, 21) fmt.Println(len(s)) // 6 fmt.Println(cap(s)) // 10扩容了通常翻倍len决定你能访问哪些索引s[0]到s[len-1]cap决定 append 时要不要分配新数组。len cap永远成立。2.2append 的两种情形append是内置函数签名大致是func append(s []T, elems ...T) []T必须接收返回值。情形一容量够len cap——原地写不换数组s : make([]int, 0, 5) // {array: A, len: 0, cap: 5} s append(s, 22) // 写 A[0]返回 {A, 1, 5} s append(s, 80) // 写 A[1]返回 {A, 2, 5}底层数组始终是 Aappend写的永远是A[len]这个新位置已有元素不动。但len变了len在切片头里所以必须把返回的新切片头赋回去。情形二容量不够len cap——分配新数组s : []int{22, 80, 443} // {array: A, len: 3, cap: 3} s append(s, 8080) // 分配新数组 Bcap 通常 6拷贝 22 80 443写 B[3]8080返回 {B, 4, 6}地址从 A 变成 B旧数组 A 被丢弃如果没有其他切片共享它。不赋值的话s还指向 A8080在 B 里完全看不到。为什么必须赋值append返回的是新的切片头len至少变了扩容时array也变了。切片头是值类型append拿不到你变量的地址只能返回新值让你赋回去。不赋值底层数据可能写进去了但len没更新你访问不到扩容时新数组直接丢。切片是一个结构体无法直接修改它的原结构体append(s,8080)是一个临时变量需要把值赋值回去
延伸阅读

更多相关文章

2026/10/24 4:08:07

项目预算和交付日期变了,为什么不能直接改台账?

项目预算和交付日期变了,为什么不能直接改台账? 一个项目开始执行后,预算需要增加,计划结束时间需要后移,项目经理也可能交接。给台账加一个编辑按钮,就能很快把最新数字填进去。但过一段时间再回头看&…

2026/10/24 4:08:07

SD NAND贴片工艺:MSL3烘烤与回流焊曲线

目录 先认清LGA-8这个物理对象 MSL3意味着上线前要做什么 回流曲线按什么控制 双面贴板的顺序 回流后的检查与曲线复核 LGA-8封装的SD NAND,焊盘全在器件底面,没有外伸引脚。上板这件事全靠锡膏印刷和回流曲线兜底,手工烙铁补焊使不上劲&…

2026/10/24 4:58:35

RTA服务端实战:RTB链路中的时序陷阱、架构取舍与降级方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 4:58:35

微电网保护变革:故障电流困境与产业链重构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 4:58:35

Cohere Python库实战:文本生成、嵌入、分类与重排序

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 4:58:35

若依系统管理内核解析:权限加载、缓存刷新与Shiro校验闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 4:58:35

大模型预训练实战:参数配比与并行策略全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 4:53:35

无界鼠标实战指南:一套键鼠控制多台电脑的原理与配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑