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

【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 {// 处理错误
        }
        
http://www.xdnf.cn/news/7239.html

相关文章:

  • 【成品设计】基于Arduino的自动化农业灌溉系统
  • 基于DeepSeek的智能客服系统实践与创新
  • 【硬核数学】2. AI如何“学习”?微积分揭秘模型优化的奥秘《从零构建机器学习、深度学习到LLM的数学认知》
  • Java线程:多任务进行
  • 鸿蒙 Location Kit(位置服务)
  • 蓝桥杯1447 砝码称重
  • Flink 快速入门
  • 【LeetCode】大厂面试算法真题回忆(93)--优雅数组
  • 几种数据加密方法
  • 践行“科学智能”!和鲸打造 AI for Science 专属应用
  • docker安装Prometheus+Grafana
  • python如何遍历postgresql所有的用户表
  • OpenHarmony外设驱动使用 (五),Fingerprint_auth
  • ubuntu22.04 卸载ESP-IDF
  • AIGC与数字金融:人工智能金融创新的新纪元
  • [Java][Leetcode middle] 151. 反转字符串中的单词
  • Dify-3:系统架构
  • 国产 iPaaS 与国外 iPaaS 产品相比如何?以谷云科技为例
  • HTML向四周扩散背景
  • Linux-进程间通信
  • Redis有哪些常用应用场景?
  • Kubernetes MCP服务器(K8s MCP):如何使用?
  • upload-labs通关笔记-第12关 文件上传之白名单GET法
  • 【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)
  • 【软考-架构】15、软件架构的演化和维护
  • 第2篇 水滴穿透:IGBT模块的绝对防御体系
  • NIFI 2.40简介及部署
  • python实现pdf转图片(针对每一页)
  • 手机内存不够,哪些文件可以删?
  • 电气材料的分类及应用