【Go】从0开始学习Go

文章目录

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

go 复制代码
package main

import "fmt"

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

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

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

1.3 其他

  1. 并发编程

    • 关键模式转换:

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

    • 面向对象思维转换:

      go 复制代码
      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. 依赖管理

    • 创建模块:

      bash 复制代码
      go mod init your-project
      go get github.com/gin-gonic/gin@v1.7.7

4 注意事项

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

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

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

      • ❌ 忽略错误返回值

      • ✅ 始终检查错误:

        go 复制代码
        if result, err := someFunc(); err != nil {
            // 处理错误
        }
相关推荐
先生沉默先18 小时前
Nginx 反向代理学习:单端口统一访问多服务
学习·nginx·arcgis
爱吃烤鸡翅的酸菜鱼18 小时前
Spring Boot 实现 WebSocket 实时通信:从原理到生产级实战
java·开发语言·spring boot·后端·websocket·spring
雪域迷影18 小时前
C++中编写UT单元测试用例时如何mock非虚函数?
开发语言·c++·测试用例·gmock·cpp-stub开源项目
AI街潜水的八角19 小时前
Python电脑屏幕&摄像头录制软件(提供源代码)
开发语言·python
hadage23319 小时前
--- git 的一些使用 ---
开发语言·git·python
LFly_ice20 小时前
学习React-24-路由传参
前端·学习·react.js
陈天伟教授20 小时前
基于学习的人工智能(3)机器学习基本框架
人工智能·学习·机器学习·知识图谱
毕设源码-钟学长20 小时前
【开题答辩全过程】以 高校课程学习评价系统设计与实现为例,包含答辩的问题和答案
学习
lly20240621 小时前
HTML与CSS:构建网页的基石
开发语言
一只会写代码的猫21 小时前
面向高性能计算与网络服务的C++微内核架构设计与多线程优化实践探索与经验分享
java·开发语言·jvm