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

【Go】从0开始学习Go

文章目录

  • 从0开始学习Go
    • 0 与C++对比
    • 1 代码框架
      • 1.1 helloworld式代码示例
      • 1.2 主体代码元素(核心三部分)
      • 1.3 其他
    • 2 与C/C++区别
    • 3 有用的小工具
    • 4 注意事项

从0开始学习Go

0 与C++对比

特性C++Go
编译型语言需要编译为机器码直接编译为二进制可执行文件
静态类型类型在编译时确定类型系统更严格,支持类型推断
指针操作支持指针(包括多级指针)支持指针(但无指针运算)
控制结构if/else for switch 相同语法更简洁(省略括号)
函数多返回值需通过引用参数或结构体返回原生支持多返回值
领域C++ 特性Go 特性
内存管理手动管理(new/delete)自动垃圾回收(GC)
并发模型基于线程(std::thread)和锁原生协程(goroutine)和通道(channel)
面向对象类继承、多态、运算符重载通过接口(interface)和组合实现多态
错误处理异常机制(try/catch)显式错误返回(多返回值模式)
包管理头文件包含(#include)模块化设计(go.mod 依赖管理)
泛型模板(template)1.18+ 支持泛型(语法更简单)
编译速度较慢(尤其大型项目)极快(依赖分析高效)

1 代码框架

1.1 helloworld式代码示例

package mainimport "fmt"func main() {fmt.Println("Hello, world!")
}

1.2 主体代码元素(核心三部分)

  • package
    • 包,表示一组代码。每个go文件都以package开头
  • import
    • 导入其他包
  • func
    • 即function,由一行或多行代码组成的组,可被其他程序调用。
    • go程序运行时会寻找main,并首先运行

1.3 其他

  1. 并发编程

    • 关键模式转换:
      // 传统线程 → Go协程
      go func() {  // 启动一个协程// 并发任务
      }()// 共享内存 → 通道通信
      ch := make(chan int)
      go func() { ch <- 42 }()
      value := <-ch
      
  2. 接口与组合

    • 面向对象思维转换:
      type Writer interface {Write([]byte) (int, error)
      }type FileWriter struct { /* 字段 */ }
      func (fw FileWriter) Write(data []byte) (int, error) {// 实现接口
      }
      

2 与C/C++区别

  1. 不以分号结尾,但可以用来分隔语句(不推荐)

3 有用的小工具

  1. go fmt
    go自带格式化工具,不需要像c++一样借助clang等工具

  2. go test
    go test -bench . # 基准测试

  3. go tool
    go tool pprof # 性能剖析

  4. 依赖管理

    • 创建模块:
      go mod init your-project
      go get github.com/gin-gonic/gin@v1.7.7
      

4 注意事项

  • 需避免的常见陷阱
    1. 过度设计

      • ❌ 用 C++ 的类层次结构设计 Go 程序
      • ✅ 使用小而精的接口 + 组合
    2. 并发误用

      • ❌ 直接共享内存(sync.Mutex 不是首选方案)
      • ✅ 优先使用通道通信
    3. 错误处理

      • ❌ 忽略错误返回值
      • ✅ 始终检查错误:
        if result, err := someFunc(); err != nil {// 处理错误
        }
        

相关文章:

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素&#xff08;核心三部分&#xff09;1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...

Windows 安装显卡驱动

1.第一步&#xff1a;打开Nvidia 官网驱动下载页面 2.第二步&#xff1a;选择相关信息&#xff0c; 玩游戏选择&#xff0c;GeForce Game Ready ,创意设计、摄影直播 选择 NVIDIA Studio 驱动程序 &#xff08;NVIDIA Studio Driver - WHQL.&#xff09; 2.第三步&#xff1…...

模块与包的导入

一、导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 类别典型库解决的问题学习门槛基础工具os、sys、json操作系统交互、序列化数据&#xff08;如读写 JSON 文件&#xff09;低科学计算n…...

Google设置app-ads.txt

问题&#xff1a; 应用上架后admob后台显示应用广告投放量受限&#xff0c;需要设置app-ads.txt才行。 如何解决&#xff1a; 官方教程: 看了下感觉不难&#xff0c;创建一个txt&#xff0c;将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…...

docker安装rockerMQ

参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址&#xff1a; https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…...

交叉引用、多个参考文献插入、跨文献插入word/wps中之【插入[1-3]、连续文献】

我们在写论文时&#xff0c;需要插入大量参考文献。 有时&#xff0c;一句话需要引用多个文献&#xff0c;如&#xff1a;[1-3]或者[1,3,4]这种形式多个文献插入、跨文献插入。 在上一篇文章中&#xff0c;我们提到可以直接打“-”或者“&#xff0c;”&#xff0c;但是word导出…...

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲

PLC双人舞&#xff1a;ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析&#xff1a;施耐德PLC与AB PLC的互联互通 在现代工业自动化中&#xff0c;设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关&#xff0c;将施耐德P…...

Image and depth from a conventional camera with a coded aperture论文阅读

Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…...

缺乏团队建设活动,如何增强凝聚力?

当一个团队缺乏系统性的建设活动时&#xff0c;成员之间容易产生疏离感、误解与信任缺失&#xff0c;最终影响整体执行力和目标达成。要有效增强团队凝聚力&#xff0c;应从设计高参与感的团队活动、结合业务与人文目标、营造持续共创的文化机制、推动跨层级协作互动等层面着手…...

特征筛选方法总结

非模型方法 一.FILTER过滤法&#xff1a; 1.缺失值比例&#xff08;80%以上缺失则删除&#xff09;/方差 注意&#xff1a; 连续变量只删方差为0的&#xff0c;因为变量取值范围会影响方差大小。 离散类的看各类取值占比,如果是三分类变量可以视作连续变量。 函数&#xff1a;V…...

力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素

这道题直接用最笨的办法来做的&#xff0c;用递归来做&#xff0c;我们定义一个全局变量vector<int> element&#xff0c;然后使用中序遍历&#xff0c;每当碰到一个非空节点就将其加入到向量中&#xff0c;这样依赖当向量中的元素小于k时&#xff0c;就返回0&#xff0c…...

pinia.defineStore is not a function

错误信息表明 pinia.defineStore 不是一个函数,这通常意味着 pinia 没有被正确导入或初始化。 解决方案 检查 Pinia 的导入 确保你从 pinia 中正确导入了 defineStore。正确的导入方式应该是: javascript import { defineStore } from ‘pinia’; 如果你使用的是 createPin…...

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了&#xff0c;这几个月很忙&#xff0c;我一直在找工作&#xff0c;在自考&#xff08;顺便还处理了一下分手的事&#xff09;&#xff0c;到处奔波&#xff0c;心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生&#xff0c;做我不愿意做的普通…...

PCL点云库点云数据处理入门系列教材目录(2025年5月更新....)

PCL点云库点云数据处理入门系列教材目录 基础阶段 第 1 讲&#xff1a;PCL库简介和安装&#xff08;Win10/11VS2019PCL 1.12.0&#xff09;第 2 讲&#xff1a;PCL库中点云基本知识和数据类型结构第 3 讲&#xff1a;PCL库中点云数据格式PCD和PLY及其输入输出&#xff08;IO&…...

Linux面试题集合(5)

把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时&#xff0c;搜寻ab字符 /ab 用more和less如何查看文件 more&#xff1a; CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …...

python动漫论坛管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

【ubuntu24.04】pycharm 死机结束进程

windows 远程pycharm到ubuntu执行程序 pycharm 在调试过程中&#xff0c;内存耗尽&#xff0c;然后死机了 pycharm 进程 (base) rootk8s-master-pfsrv:/home/zhangbin/下载# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …...

Java 中Supplier延迟生成值的原因

在编程中&#xff0c;延迟生成值&#xff08;Lazy Value Generation&#xff09; 是指将值的计算或生成过程推迟到真正需要使用该值时才执行。这一机制的核心是避免不必要的计算&#xff0c;提升程序的性能和资源利用率。结合 Supplier 和 Optional 的使用场景&#xff0c;我们…...

设置windows10同时多用户登录方法

RDP wrapper 的版本更新停止在2017年&#xff0c; 找到网上其它大神更新的软件&#xff0c; 参考&#xff1a;RDPWrap v1.8.9.9 (Windows家庭版开启远程桌面、Server解除远程数量限制&#xff09; - 吾爱破解 - 52pojie.cn 我的需求是在离线环境中布置&#xff0c;方法是&…...

Web 技术与 Nginx 网站环境部署

这里写目录标题 一. Web基础域名和DNS域名的概念域名的结构域名结构类型 Hosts文件Hosts文件的作用修改Hosts文件 DNS域名注册 网页与HTML网页概述HTML概述HTML基本标签HTML语法规则HTML文件结构 网站和主页Web1.0 与 Web2.0 静态网页与动态网页静态网页动态网页动态网页语言 H…...

分组背包问题:如何最大化背包价值?

有 N 组物品和一个容量是 V 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 vij &#xff0c;价值是 wij &#xff0c;其中 i 是组号&#xff0c;j 是组内编号。 求解将哪些物品装入背包&#xff0c;可使物品总体积不超过背包容量&…...

nodejs快速入门到精通1

参考 nodejs快速入门到精通 菜鸟教程-nodejs nodejs官方文档 原因 视频免费 资料收费 笔记还是自己写吧 安装 nodejs官网 windows下&#xff1a; #查看nodejs版本 node -v #查看npm版本 npm -v #设置npm为淘宝镜像源 npm config set registry https://registry.npmmirror.…...

FP8精度革命:Hopper架构下大模型训练的误差传播控制方法

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、FP8为何成为大模型训练的新范式&#xff1f; 1.1 算力需求与精度演进的矛盾 当前大语言…...

手动制做一个Transformer

本文来自I made a transformer by hand . 一直以来&#xff0c;笔者对 transformer 的注意力机制、qkv的理解都浮于表面&#xff0c;当然也不是说我看完 I made a transformer by hand 后理解有多深入&#xff0c;但确实加深了我对相关概念的理解&#xff0c;故搬运此文章&…...

已解决——如何让网站实现HTTPS访问?

一、申请SSL证书 SSL证书是HTTPS实现的关键&#xff0c;它由受信任的证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;用于验证网站的身份并加密数据传输。以下是申请SSL证书的常见步骤&#xff1a; 选择证书类型 根据网站的需求和预算&#xff0c;选择合适的SSL证书…...

WebRTC技术EasyRTC嵌入式音视频通信SDK助力智能电视搭建沉浸式实时音视频交互

一、方案概述​ EasyRTC是一款基于WebRTC技术的开源实时音视频通信解决方案&#xff0c;具备低延迟、高画质、跨平台等优势。将EasyRTC功能应用于智能电视&#xff0c;能够为用户带来全新的交互体验&#xff0c;满足智能电视在家庭娱乐、远程教育、远程办公、远程医疗等多种场…...

Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目

环境&#xff1a; Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程&#xff1a; 链接遇到的问题&#xff08;问题&#xff1a;解决方案&#xff09; 点击Linux打包按钮&#xff0c;跳转至网页而不是执行打包流程&#xff1a;用VS打开项…...

Spring MVC HttpMessageConverter 的作用是什么?

HttpMessageConverter (HTTP 消息转换器) 是 Spring MVC 框架中一个非常核心的组件&#xff0c;它的主要作用是在 HTTP 请求、响应体与 Java 对象之间进行双向转换。 核心作用&#xff1a; 读取请求体 (Request Body) 到 Java 对象&#xff1a; 当 Controller 方法的参数使用 …...

小乌龟git中的推送账户、作者账户信息修改

文章目录 修改git文档作者信息修改git推送用户信息参考文献 修改git文档作者信息 小乌龟中的用户信息为&#xff1a;作者信息&#xff0c;并非推送用户。 上边用户信息&#xff0c;修改的是文件的作者信息。如果想要修改git服务中记录的推送用户信息需要修改推送用户信息。 …...

Kubernetes MCP服务器(K8s MCP):如何使用?

#作者&#xff1a;曹付江 文章目录 1、什么是 Kubernetes MCP 服务器&#xff1f;1.1、K8s MCP 服务器 2、开始前的准备工作2.1. Kubernetes集群2.2. 安装并运行 kubectl2.3. Node.js 和 Bun2.4. &#xff08;可选&#xff09;Helm v3 3、如何设置 K8s MCP 服务器3.1. 克隆存储…...