从C语言到Go语言:新手快速入门指南
对于刚学会C语言的新手来说,学习Go语言(Golang)可能是一个既有趣又有挑战性的过程。Go语言由Google开发,以简洁、高效和并发支持著称,被广泛用于现代软件开发。相比C语言,Go语言在语法上更加现代化,同时保留了一些熟悉的特性。如果你已经熟悉C语言的基本概念,比如变量、循环和函数,那么恭喜你,你已经有了一个不错的起点!
在浏览了众多Go语言教程后,我感觉还是《Go语言之旅》(tour.studygolang.com)最适合新手。它通过交互式代码示例逐步引导你掌握Go语言的核心特性。本文将从一个C语言新手的视角出发,详细总结Go语言的基本语法规则,尤其是与C/C++的区别,帮助你快速上手Go语言。
一、从C到Go:初识Go语言的语法变化
学习一门新语言,首先要了解它与你已知语言的异同。对于C语言用户来说,Go语言既熟悉又陌生。以下是我在学习Go语言基本语法时总结的一些关键差异,特别适合刚学会C的新手快速过渡。
1. 分号不再是必须的
在C语言中,每条语句后面通常需要加分号(;
),例如:
int a = 10;
printf("Hello, world!\n");
而在Go语言中,分号是可选的,编译器会自动在语句结束处插入分号。因此,Go代码看起来更简洁:
package main
import "fmt"func main() {fmt.Println("Hello, world!")
}
初学者可能会觉得这很方便,但要注意,Go的换行规则很严格。如果你在同一行写多条语句,仍然需要用分号分隔,否则会报错。
2. 未使用的包或变量会导致编译失败
C语言允许你声明变量或包含头文件后不使用它们,编译器最多给个警告。但在Go语言中,如果你导入了一个包(import "fmt"
)却没用,或者声明了一个变量却没用到,编译会直接失败。例如:
package main
import "fmt"func main() {var x int // 声明了x但没使用,编译失败
}
这种设计强制开发者保持代码简洁,避免冗余。对新手来说,这可能有点苛刻,但养成好习惯后会受益匪浅。
3. 大括号的强制C风格
C语言和C++允许灵活使用大括号,比如:
if (a > b) { printf("a is bigger\n"); }
或者换行写成:
if (a > b)
{printf("a is bigger\n");
}
但在Go语言中,大括号必须紧跟在语句后面,不能换行。例如:
if a > b { // 正确fmt.Println("a is bigger")
}if a > b // 错误,编译失败
{fmt.Println("a is bigger")
}
这强制了统一的代码风格,虽然初学时可能不习惯,但能让代码更一致。
4. 变量声明:名称在前,类型在后
C语言的变量声明是“类型+名称”,比如:
int a = 10;
char b = 'c';
Go语言则相反,变量名称在前,类型在后:
var a int = 10
更妙的是,Go支持类型推导,你可以省略类型:
var b = 10 // 自动推导为int
甚至可以用简洁的:=
语法(仅限函数内部):
c := 20 // 自动推导为int
另外,Go没有char
类型,字符用rune
表示(本质是int32
),还有独特的复数类型complex64
和complex128
,这在C中是没有的。
二、控制流的变化
控制流是编程的核心,Go语言在for
、if
和switch
等方面与C有显著不同。
5. For循环取代While
C语言有for
和while
两种循环:
int i = 0;
while (i < 10) {printf("%d\n", i);i++;
}
Go语言没有while
,但for
非常灵活,可以完全替代。例如:
i := 0
for i < 10 {fmt.Println(i)i++
}
Go的for
不要求小括号,但大括号是必须的。传统的三段式for
也支持:
for i := 0; i < 10; i++ {fmt.Println(i)
}
甚至可以用for
实现无限循环(Go 的循环结构只有 for,因此不再使用 while true):
for {fmt.Println("Infinite loop")break // 用break跳出
}
6. Switch语句更强大
C语言的switch
要求case
后是常量,且需要手动加break
:
switch (x) {case 1:printf("One\n");break;case 2:printf("Two\n");break;
}
Go的switch
不需要break
,而且case
可以是表达式,甚至变量:
x := 10
switch x {
case 5 + 5:fmt.Println("Ten")
case 20:fmt.Println("Twenty")
default:fmt.Println("Other")
}
这让switch
更灵活,初学者可以尝试用它替代复杂的if-else
。
7. defer语句:延迟执行的魔法
Go引入了defer
关键字,用于延迟函数调用,直到外层函数返回。例如:
package main
import "fmt"func main() {defer fmt.Println("world")fmt.Println("hello")
}
输出是:
hello
world
defer
常用于资源释放(比如关闭文件)或异常处理。多个defer
会按栈的顺序(后进先出)执行:
defer fmt.Println("first")
defer fmt.Println("second")
输出:
second
first
三、数据类型与操作的变化
8. 自增自减的限制
C语言中,++i
和--i
可以嵌入表达式:
int a = 5;
int b = a++ + 3; // b = 8, a = 6
Go语言只支持i++
和i--
,且必须单独使用,不能嵌入表达式:
i := 5
i++ // 正确
b := i + 3 // 正确
b := i++ + 3 // 错误,编译失败
9. 浮点数比较的正确姿势
C语言中直接比较浮点数可能因精度问题出错:
float a = 0.1 + 0.2;
if (a == 0.3) { // 不一定成立printf("Equal\n");
}
Go语言同样如此,推荐用误差范围比较:
import "math"func isEqual(f1, f2, p float64) bool {return math.Abs(f1-f2) < p
}func main() {a := 0.1 + 0.2fmt.Println(isEqual(a, 0.3, 0.0001)) // true
}
10. 字符串是只读的
C语言中字符串可以用字符数组修改:
char s[] = "hello";
s[0] = 'H'; // 修改为 "Hello"
Go的字符串是只读的,要修改需转为[]byte
:
s := "hello"
b := []byte(s)
b[0] = 'H'
s = string(b) // "Hello"
11. 数组与切片
C语言的数组长度是固定的,Go也是如此,但长度是类型的一部分:
var a [3]int // 长度3的int数组
var b [4]int // 不同类型,不能直接赋值给a
Go还引入了切片(slice),类似动态数组:
s := []int{1, 2, 3} // 切片
s = append(s, 4) // 添加元素
用make
创建切片:
s := make([]int, 5) // 长度5,元素为0
s := make([]int, 0, 5) // 长度0,容量5
四、函数与高级特性
12. 函数声明与返回值
Go的函数声明与C不同,返回值类型在后:
func add(a int, b int) int {return a + b
}
支持多返回值:
func swap(a, b int) (int, int) {return b, a
}
13. 匿名函数与闭包
Go支持匿名函数:
f := func(x int) int {return x * 2
}
fmt.Println(f(5)) // 10
函数还能返回函数,形成闭包:
func counter() func() int {i := 0return func() int {i++return i}
}
14. 方法与结构体
Go没有类,但可以用结构体和方法模拟:
type Person struct {Name string
}func (p Person) SayHello() {fmt.Println("Hello, " + p.Name)
}func main() {p := Person{Name: "Alice"}p.SayHello() // Hello, Alice
}
五、总结与学习建议
从C到Go,语法变化看似繁多,但核心理念是简洁和高效。对于新手,建议从《Go语言之旅》开始,结合本文的对比,逐步掌握Go的特性。实践是关键,多写代码、多调试,很快你就能适应Go的世界!
相关文章:
从C语言到Go语言:新手快速入门指南
对于刚学会C语言的新手来说,学习Go语言(Golang)可能是一个既有趣又有挑战性的过程。Go语言由Google开发,以简洁、高效和并发支持著称,被广泛用于现代软件开发。相比C语言,Go语言在语法上更加现代化…...
Vue.js 中 v-model 的使用及其原理
在 Vue.js 开发中,v-model是一个非常重要且常用的指令。它极大地简化了表单元素与数据之间的双向绑定操作,让开发者能够更高效地处理用户输入和数据更新。接下来,我们将深入探讨v-model的使用场景及其背后的工作原理。 一、v-model 的基本…...
深入解析哈希表:从原理到实现(拉链法详解)
哈希表(Hash Table)是计算机科学中最重要的数据结构之一,它能够在平均 O(1) 时间内完成数据的插入、删除和查找操作。本文将围绕**拉链法(Chaining)**的实现,结合代码示例和图示,深入讲解哈希表…...
okcc呼叫中心系统坐席签入长签和普通签入的区别
在OKCC呼叫中心系统中,坐席的长签(持久签入)与普通签入(常规签入)是两种不同的登录模式,主要区别体现在 会话保持时长、资源占用、业务场景适配性 等方面。以下是具体对比: 一、核心区别对比 维…...
2024年博客之星的省域空间分布展示-以全网Top300为例
目录 前言 一、2024博客之星 1、所有排名数据 2、空间属性管理 二、数据抓取与处理 1、相关业务表的设计 2、数据抓取处理 3、空间查询分析实践 三、数据成果挖掘 1、省域分布解读 2、技术开发活跃 四、总结 前言 2024年博客之星的评选活动已经过去了一个月…...
7.3 在通知中显示图片或视频(UNNotificationAttachment)
在iOS通知中显示富媒体内容可以显著提升用户体验。通过UNNotificationAttachment,我们可以为本地和远程通知添加图片、音频、视频等内容。 基本实现方法 1. 创建带附件的通知 func scheduleNotificationWithImage() {// 1. 创建通知内容let content UNMutableNo…...
1.5-APP的架构\微信小程序的架构
1.5-APP的架构\微信小程序的架构 APP的三种开发架构: 原生态APP类型 APP-开发架构-原生态-IDEA 演示:remusic项目源码 NP管理器: http://normalplayer.top/ HttpCanary:https://github.com/mingww64/HttpCanary-SSL-Magisk 安全影…...
Python缩进完全指南:语法规则、使用场景与最佳实践
一、Python缩进的核心概念 Python的缩进不仅是代码风格问题,更是语法的一部分,这是Python区别于其他编程语言最显著的特征之一。 1.1 什么是缩进? 缩进是指在代码行前添加空格或制表符来实现代码块的层级结构。在Python中,缩进…...
高通音频数据从HAL到DSP
概述 参考高通平台8155 从数据流的角度整理下安卓平台音频数据从HAL层到达DSP这个流程; 以 MultiMedia22 --> QUIN_TDM_RX_0 播放为例; 主要关注pcm数据写到dsp, 以及将前后端路由信息告知dsp两个点。 <!-- more --> [Platform:高通 8155 gvmq Android 11] [Ker…...
第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型
Unity Shader的学习笔记 第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型 文章目录 Unity Shader的学习笔记前言一、漫反射光照模型1.逐像素光照① 更改v2f② 传递法线信息给片元着色器③ 片元着色器计算漫反射光照模型 二.半兰伯特模型总结 前言 提示&am…...
【RabbitMQ】队列模型
1.概述 RabbitMQ作为消息队列,有6种队列模型,分别在不同的场景进行使用,分别是Hello World,Work queues,Publish/Subscribe,Routing,Topics,RPC。 下面就分别对几个模型进行讲述。…...
【Java设计模式】第3章 软件设计七大原则
3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…...
Axure中继器(Repeater): 列表展示
文章目录 引言I 中继器说明中继器的作用中继器的结构中继器例子II 中继器基础应用:列表展示表头制作列表内容表头中的列与中继器的列绑定填充数据内容引言 中继器是Axure RP 7.0推出的新功能,用于快速设计一些复杂的交互界面(制作“高保真”的动态原型)。 I 中继器说明 中…...
mybatis的第五天学习笔记
12. 动态SQL 12.1 动态SQL概述 新增内容: 动态SQL执行流程 MyBatis如何解析动态SQLSQL语句构建过程参数绑定机制 新增示例 // 动态条件查询接口示例 List<User> searchUsers(Param("name") String name,Param("age") Integer age,Para…...
LeetCode 941 有效的山脉数组
算法探索:如何精准判断有效山脉数组 在计算机科学领域,算法和数据结构堪称基石,它们不仅是解决复杂问题的有力工具,更是衡量程序员技术水平的重要指标。数组作为最基础、应用最广泛的数据结构之一,围绕它衍生出了大量…...
java设计模式-单例模式
单例模式 1、饿汉式(静态常量) Slf4j public class SingletonTest01 {public static void main(String[] args) {Singleton singleton Singleton.getInstance();Singleton singleton2 Singleton.getInstance();log.info("比对结果:{}",singletonsingl…...
对抗Prompt工程:构建AI安全护栏的攻防实践
大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例,揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理,提出融合动态意图拓扑分析(DITA)、对抗…...
CentOS 环境下 MySQL 数据库全部备份的操作指南
最近阿里云个人服务到期,因为是很久之前买的测试机器,配置较低,上面运行的有技术博客 和以往的测试项目,所以准备放弃掉。 需要备份下上面的表结构和数据、以及代码仓库。 下面是一个完整的 CentOS 环境下 MySQL 数据库全部备份…...
回溯算法补充leetcode
1. 组合 leetcode题目链接:77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示…...
利用 AI 实现雷池 WAF 自动化运维
欢迎加入雷池社区:雷池 WAF | 下一代 Web 应用防火墙 | 免费使用 已经升级到 8.4.0 的兄弟们应该会发现雷池又多了一些 AI 能力,8.4.0 更新公告。 感谢 Web2GPT 为雷池提供的 AI 能力支持。 主要变化 右下角多了一个 AI 小助手 按钮右上角多了一个 连…...
【嵌入式面试】
1、如果中断函数中有耗时较长的内容,会导致以下问题,如何解决? 对系统实时性的影响 阻塞低优先级中断:中断函数执行时间过长,会阻塞其他低优先级中断的响应。例如,如果一个高优先级中断处理程序中包含耗时…...
【Hadoop入门】Hadoop生态之HDFS
1 HDFS核心设计原理 HDFS(Hadoop Distributed File System)是专为大规模数据存储设计的分布式文件系统,其核心设计基于以下原则: 数据分块与分布式存储: 分块机制:文件被切分为固定大小的数据块(…...
试剂SYBR 14核酸染料在染色时的操作步骤(说明)
化学试剂的基本内容||试剂参数 ---中文名:SYBR 14核酸染料 ---英文名:SYBR 14 Nucleic Acid Stain ---浓度:通常以5mM的DMSO储存液形式提供。 ---吸收波长:488nm ---发射波长:518nm ---出厂商:西安强…...
Spring Boot 国际化配置项详解
Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别,便于快速定位: 1.1 消息源配置(MessageSource 相关) 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…...
Python之禅:深入理解Python设计哲学
Python之禅(The Zen of Python)是Python语言的核心设计哲学,由Python创始人Guido van Rossum和Tim Peters共同制定。理解Python之禅不仅能帮助我们写出更"Pythonic"的代码,还能深入把握Python语言的设计理念。 Python之禅的由来 Python之禅最…...
Rancher 全面介绍
目录 Rancher 全面介绍1. **Rancher 的定义与核心功能**2. **Rancher 的应用场景**3. **Rancher 的生态系统**4. **Rancher 的优势**5. **总结** Rancher 全面介绍 1. Rancher 的定义与核心功能 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,旨在简化容…...
Docker常用命令
镜像命令 搜索镜像 docker search nginx 拉取镜像 docker pull nginx,默认拉取最新镜像 docker pull nginx:1.25.3,拉取指定版本 查看镜像 docker images 删除镜像 docker rmi nginx:1.25.3 docker rmi -f $(docker images -aq),删除全…...
项目中如何防止超卖
什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。 方案1:数据库行级锁 1. 实体类 Data TableName("product") public class Product {TableId(type IdType.AUTO)private Lon…...
龙虎榜——20250408
行情如下 根据2025年4月8日的龙虎榜的行业分析如下: 一、农业种植与乡村振兴 • 政策催化:推进种业自主创新、农机装备升级等目标,叠加中美关税反制逻辑。 • 市场表现: • 农业种植:种子类企业因国产替代预期受资…...
快速上手Vue3国际化 (i18n)
文章目录 一、背景介绍二、页面效果三、使用步骤四、代码1.src/App.vue2.src/main.js3.src/locales/index.js4.src/views/login/_request.js5.src/locales/en.json6.src/locales/zh.json7.SystemParam.vue8.I18NController.java9.DataServiceConfigValue.java10.ConfigValue.ja…...
Mistral OCR:重新定义文档理解的下一代 OCR 技术
引言 在数字化时代,文档处理和理解是企业、科研机构以及个人工作流程中的重要环节。然而,传统的光学字符识别(OCR)技术往往难以应对复杂文档中的多语言、多模态内容。近日,法国 AI 明星创企 Mistral AI 推出了一款名为 Mistral OCR 的光学字符识别 API,以其卓越的性能和…...
前端面试核心知识点整理:从 JavaScript 到 Vue 全解析
一、JavaScript 异步编程核心:Promise 与 async/await 1. Promise 深度解析 定义:Promise 是处理异步操作的对象,代表一个异步操作的最终状态(成功 / 失败)。三种状态: pending(进行中):初始状态,异步操作未完成。fulfilled(已成功):异步操作成功,调用 resolve …...
npm fund 命令的作用
运行别人的项目遇到这个问题: npm fund 命令的作用 npm fund 是 npm 提供的命令,用于显示项目依赖中哪些包需要资金支持。这些信息来自包的 package.json 中定义的 funding 字段,目的是帮助开发者了解如何支持开源维护者。 典型场景示例 假…...
LeetCode344反转字符串
思路: 交换即可 void reverseString(char* s, int sSize) {int jsSize-1;for(int i0;i<sSize/2;i){int tmps[i];s[i]s[j];s[j]tmp;j--;} }...
[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录
[Python] 为企业网站应用接入钉钉鉴权,实现钉钉客户端内自动免登授权,浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限,没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…...
设计模式-单例设计模式
目录 什么是单例设计模式? 为什么要使用单例模式? 资源方面 数据一致方面 系统性能方面 代码维护方面 如何设计单例类? 在说模式之前,我们需要先知道怎么设计才可以让一个类只能有一个实例化对象呢? 饿汉模式…...
Nextjs15 实战 - React Notes CURD 实现
本专栏内容均可在Github:notes_04 找到 完整项目使用技术栈: Nextjs15 MySQL Redis Auth Prisma i18n strapi Docker vercel 一、本节目标 本篇我们来实现右侧笔记CURD部分。 一、效果 当点击 New 按钮的时候进入编辑界面: 当点击…...
【KWDB 创作者计划】架构设计与AIoT场景实践
产品定位与核心价值主张 架构设计与技术实现 分布式架构设计 多模存储引擎实现 云边端协同机制 核心技术创新解析 就地计算技术 自适应时序引擎 混合事务处理 性能优化技术体系 高效存储机制 查询加速策略 资源管理与隔离 行业解决方案与典型应用 工业物联网平台…...
DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析
4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术,粗浅分析如下: 与LoRA的对比 区别: 应用场景:LoRA是一种参数高效微调方法,主要用于在…...
Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...
Linux网络配置与测试
目录 一.与网络配置相关的命令 1.1ifconfig命令 1.1.1作用 1.1.2网络接口的信息 接口信息的组成 1.1.3显示所有网卡包括没有启动的网卡 1.1.4查看指定网络接口 1.1.5开启或关闭网卡 1.1.6设置临时虚拟网卡 1.1.7网络通讯情况 编辑 1.1.8临时修改网卡属性 1.2hos…...
游戏赛季和数据处理
问题 游戏从无赛季到赛季机制会涉及哪些问题: 如何改动,增加赛季机制,涉及要修改的代码量最少如何改动,账号、角色部分数据继承问题,涉及要修改的代码量最少账号下角色的永久服共享或是永久服独立,需要做…...
京东店铺托管7*16小时全时护航
内容概要 京东店铺托管服务的*716小时全时护航模式,相当于给商家配了个全年无休的"运营管家"。专业团队每天从早7点到晚11点实时盯着运营数据和商品排名,连半夜流量波动都能通过智能系统秒级预警。这种全天候服务可不是单纯拼人力——系统自动…...
HTTP的Keep-Alive是什么?TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
HTTP的Keep-Alive: HTTP Keep-Alive 是一种机制,允许客户端和服务器在单个 TCP 连接 上发送多个 HTTP 请求 和 响应,而不是每次请求和响应后都关闭连接。它的主要目的是提高性能,减少连接的开销,优化通信效率。 工作…...
使用scoop一键下载jdk和实现版本切换
安装 在 PowerShell 中输入下面内容,保证允许本地脚本的执行: set-executionpolicy remotesigned -scope currentuser然后执行下面的命令安装 Scoop: iwr -useb get.scoop.sh | iex国内用户可以使用镜像源安装:powershell iwr -us…...
PPIO × UI-TARS:用自然语言操控电脑,AI Agent 的极致体验
Manus的爆火预示着AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。字节跳动近期推出的开源项目 UI-TARS Desktop 为我们展示了一种全新的可能性:能够通过自然语言理解和处理来控制计算机界面。这款工具代表了人工智能与人机交互领域的重大突破,…...
PG:incorrect prev-link
目录 WAL日志中"incorrect prev-link"错误解决方案错误原因分析解决步骤典型修复案例 WAL日志中"incorrect prev-link"错误解决方案 错误原因分析 WAL日志的prev-link字段用于确保日志记录的连续性。当出现incorrect prev-link 2/754ECB0 at 2/8000028错…...
SQL Server 数据库邮件配置失败:SMTP 连接与权限问题
问题现象: 配置数据库邮件时,发送测试邮件失败,提示 “邮件无法发送到 SMTP 服务器,操作超时”(错误 14661)或 “服务器拒绝发件人地址”(错误 15009)。 快速诊断 检查数据库邮件配置…...
深入浅出动态规划:从基础到蓝桥杯实战(Java版)
引言:为什么你需要掌握动态规划? 动态规划(DP)是算法竞赛和面试中的常客,不仅能大幅提升解题效率(时间复杂度通常为O(n)或O(n))[4],更是解决复杂优化问题的利器。统计显示ÿ…...
获取cookie的chrome插件:Get cookies.txt LOCALLY
接上一篇,在下载视频的时候需要网站的cookie,下面介绍一款可以获取网站cookie的chrome插件 https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?utm_sourceitem-share-cb 备注需要科学上网 【使用方…...