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

Go语言入门基础详解

一、语言历史背景

Go语言由Google工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年设计,2009年正式开源。设计目标:

  • 兼具Python的开发效率与C的执行性能
  • 内置并发支持(goroutine/channel)
  • 简洁的类型系统
  • 现代化的包管理
  • 跨平台编译能力
// 经典Hello World示例
package main  // 声明包名import "fmt"  // 导入标准库func main() {  // 程序入口fmt.Println("Hello, 世界!")  // 调用标准库输出
}

二、语言工作原理

  1. 编译过程
    • 源代码 → 词法分析 → 语法树 → 中间代码 → 机器码
    • 生成静态二进制文件,无外部依赖
  2. 执行方式
    go run main.go    # 直接运行
    go build main.go  # 编译生成可执行文件
    
  3. 跨平台编译:
    GOOS=linux GOARCH=amd64 go build -o app
    

三、开发工具推荐

工具类型推荐方案
代码编辑器VS Code + Go插件
专业IDEGoLand
调试工具Delve (dlv)
包管理Go Modules
格式化工具gofmt + goimports

四、语言核心语法

1. 变量与常量

func variables() {// 短声明(函数内可用)a := 10  // 标准声明var b string = "golang"// 批量声明var (c intd bool)// 常量声明const PI = 3.14const (STATUS_OK = 200NOT_FOUND = 404)// iota枚举const (_ = iotaKB = 1 << (10 * iota)  // 1 << 10MB                      // 1 << 20)
}

2. 数据类型

type User struct {  // 结构体定义ID       intUsername string
}func dataTypes() {// 基本类型var num int = 42str := "go"// 复合类型arr := [3]int{1,2,3}       // 数组slice := []string{"a","b"} // 切片m := map[string]int{"x":1} // 映射// 指针ptr := &num// 接口类型var writer io.Writer = os.Stdout
}

3. 控制结构

func controlFlow() {// if条件判断if x := 10; x > 5 {fmt.Println("x大于5")}// for循环(无while)for i := 0; i < 5; i++ {fmt.Println(i)}// range迭代nums := []int{2,4,6}for idx, val := range nums {fmt.Printf("索引:%d 值:%d\n", idx, val)}// switch语句switch time.Now().Weekday() {case time.Saturday, time.Sunday:fmt.Println("周末")default:fmt.Println("工作日")}
}

4. 函数特性

// 多返回值函数
func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("除数不能为零")}return a / b, nil
}// 命名返回值
func sum(nums ...int) (total int) {for _, n := range nums {total += n}return
}// 匿名函数
func anonymous() {square := func(x int) int {return x * x}fmt.Println(square(5))
}

5. 并发模型

func concurrency() {var wg sync.WaitGroup// 启动goroutinewg.Add(1)go func() {defer wg.Done()fmt.Println("异步执行")}()// Channel通信ch := make(chan int)go func() {ch <- 42  // 发送数据}()val := <-ch  // 接收数据wg.Wait()fmt.Println("接收值:", val)
}

6. 错误处理

func errorHandling() {// 常规错误处理f, err := os.Open("file.txt")if err != nil {log.Fatal(err)}defer f.Close()  // 确保资源释放// panic恢复defer func() {if r := recover(); r != nil {fmt.Println("Recovered:", r)}}()panic("触发panic")
}

五、实战案例

案例1:HTTP服务器

package mainimport ("fmt""net/http"
)func main() {// 注册路由处理函数http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "欢迎访问!路径:%s", r.URL.Path)})// 启动服务器fmt.Println("服务器运行在 :8080")http.ListenAndServe(":8080", nil)
}

案例2:并发文件处理

package mainimport ("fmt""io/ioutil""sync"
)func processFile(path string, wg *sync.WaitGroup) {defer wg.Done()data, err := ioutil.ReadFile(path)if err != nil {fmt.Printf("读取%s失败: %v\n", path, err)return}fmt.Printf("文件%s大小: %d字节\n", path, len(data))
}func main() {files := []string{"a.txt", "b.txt", "c.txt"}var wg sync.WaitGroupfor _, f := range files {wg.Add(1)go processFile(f, &wg)}wg.Wait()fmt.Println("所有文件处理完成")
}

六、包管理(Go Modules)

  1. 初始化模块:
    go mod init example.com/myproject
    
  2. 示例go.mod:
    module example.com/myprojectgo 1.20require (github.com/gin-gonic/gin v1.9.0golang.org/x/sync v0.1.0
    )
    

本文涵盖Go语言核心知识点,建议通过以下步骤深入学习:

  1. 完成官方Tour教程(tour.golang.org)
  2. 阅读《Go语言圣经》
  3. 参与开源项目(GitHub Trending)
  4. 实践Web开发(Gin/Echo框架)
  5. 学习并发模式(《Concurrency in Go》)

相关文章:

Go语言入门基础详解

一、语言历史背景 Go语言由Google工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年设计&#xff0c;2009年正式开源。设计目标&#xff1a; 兼具Python的开发效率与C的执行性能内置并发支持&#xff08;goroutine/channel&#xff09;简洁的类型系统现代化的包管理跨…...

WPF窗口读取、显示、修改、另存excel文件——CAD c#二次开发

效果如下&#xff1a; using System.Data; using System.IO; using System.Windows; using Microsoft.Win32; using ExcelDataReader; using System.Text; using ClosedXML.Excel;namespace IfoxDemo {public partial class SimpleWindow : Window{public SimpleWindow(){Initi…...

Ubuntu 服务器安装 Python 环境 的详细指南

以下是 在 Ubuntu 上安装 Python 3.10 的详细步骤&#xff08;兼容 Ubuntu 20.04/22.04&#xff09;&#xff1a; 方法一&#xff1a;通过 PPA 仓库安装&#xff08;推荐&#xff09; 1. 添加 deadsnakes PPA sudo apt update sudo apt install software-properties-common s…...

鸿蒙next 多行文字加图片后缀实现方案

需求 实现类似iOS的YYLabel之类的在文字后面加上图片作为后缀的样式&#xff0c;多行时文字使用…省略超出部分&#xff0c;但必须保证图片的展现。 系统方案 在当前鸿蒙next系统提供的文字排版方法基本没有合适使用的接口&#xff0c;包括imagespan和RichEditor,根据AI的回…...

STM32---FreeRTS队列集

一、简介 一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以使用队列集 &#xff01; 作用&#xff1a;用于对多个队列或信号量进行“监听”&#xff0c;其中不管哪一个消息到来&#xff0c;都可让…...

oracle11.2.0.4 RAC 保姆级静默安装(二) DB数据库软件

1.响应文件配置 [rootdb11g1 software]# su - oracle [oracledb11g1 ~]$ cd /software/database/ [oracledb11g1 database]$ cd response/ [oracledb11g1 response]$ vi db_install.rsp oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAMEdb11g1 UNIX_GROUP_NAME…...

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…...

【每日学点HarmonyOS Next知识】状态变量、动画UI残留、Tab控件显示、ob前缀问题、文字背景拉伸

1、HarmonyOS 怎么用一个变量观察其他很多个变量的变化&#xff1f; 有一个提交按钮的颜色&#xff0c;需要很多个值非空才变为红色&#xff0c;否则变为灰色&#xff0c;可不可以用一个变量统一观察这很多个值&#xff0c;去判断按钮该显示什么颜色&#xff0c;比如Button().…...

【第五节】windows sdk编程:windows 控件基础

目录 一、控件概述 二、标准控件 三、通用控件 四、控件的创建 五、控件风格 六、控件相关的消息 6.1 控件控制消息 6.2 控件通知消息 一、控件概述 控件是 Windows 系统内置的窗口类&#xff0c;它们只能是某个窗口的子窗口。因此&#xff0c;创建控件时必须使用 WS_C…...

架构师论文《论云原生架构及其应用》

【摘要】 2022年3月&#xff0c;我作为系统架构师参与了某大型零售企业“智能化供应链管理平台”项目的设计与实施工作。该平台旨在整合企业分散在不同区域的仓储、物流、库存及订单系统&#xff0c;构建统一管理的云原生架构&#xff0c;以应对业务季节性峰值带来的弹性伸缩需…...

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…...

46.全排列

46.全排列 力扣题目链接 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a…...

RabbitMQ (Java)学习笔记

目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制&#xff08;解决消息堆积方案之一&#…...

2-002:MySQL 索引的最左前缀匹配原则是什么?

MySQL 索引的最左前缀匹配原则 最左前缀匹配原则&#xff08;Leftmost Prefix Matching&#xff09; 是指&#xff1a; 当 查询使用了复合索引&#xff08;联合索引&#xff09; 时&#xff0c;MySQL 会优先匹配索引的 最左列&#xff0c;然后逐步向右匹配&#xff0c;直到遇到…...

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…...

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长&#xff0c;校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备&#xff0c;其在校园中的应用不仅能够提高电力系统的安全性&#xff0c;还能有效保障师生的用电安全&am…...

疗养院管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用&#xf…...

基于 Redis Stream 实现消息队列功能

好长时间没更新了。。。。。。 背景&#xff1a;举个例子在某个接口执行完成后只需要前半段返回结果&#xff0c;后半段可能是日志记录、下游系统调用等功能的情况下&#xff0c;将耗时的消息进行异步发送就显得很有必要&#xff0c;这时就有很多种选择&#xff0c;单体项目甚至…...

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤&#xff1a; 编写测试用例&#xff0c;覆盖代码的各个分支和边界条件。使用测试框架&#xff08;如JUnit、NUnit&#xff09;执行测试。检查测试结果&#xff0c;确保代码按预期运行。修复发现的缺陷并重新测…...

深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素虽看似普通&#xff0c;却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木&#xff0c;能够将各种 HTML 元素巧妙地组合起来&#xff0c;无论是构建页面布局&#xff0c;还是对局部内容进行样式调整&#xff…...

网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合

目录 一、dirsearch 工具详细使用攻略 1. 安装 前提条件 安装步骤 可选&#xff1a;直接下载预编译版本 2. 基本用法 命令格式 参数说明 示例 3. 核心功能与高级用法 3.1 多线程加速 3.2 自定义字典 3.3 递归扫描 3.4 过滤响应 3.5 添加请求头 3.6 代理支持 3…...

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…...

27.卷2的答案

CSP-J离我们不远了&#xff0c;加加油啦&#xff01; 1.堆排序最坏时间复杂度是&#xff1f; 解析&#xff1a;平时多多练习可知&#xff0c;最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位&#xff0c;并将第二位四舍五入&#xff1f; 解析&#xff1a;经过试…...

【 Manus平替开源项目】

文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands&#xff08;原OpenDevin&#xff09;3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者&#xff08;5…...

【WEB APIs】DOM-事件基础

目录 1. 事件监听&#xff08;绑定&#xff09; 案例—关闭广告 案例-随机点名 2. 事件类型 2.1 鼠标事件 2.2 焦点事件 2.3 文本事件 3. 事件对象 案例—评论回车发布 4. 环境对象 5. 回调函数 6. 综合案例—tab栏切换 1. 事件监听&#xff08;绑定&#xff09; …...

66.Harmonyos NEXT 图片预览组件使用指南

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件使用指南 文章目录 Harmonyos NEXT 图片预览组件使用指南效果预览一、组件使用概述1. 组件功能特点2. 组件依赖关系 二…...

linux系统安装和激活conda

安装 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash ./Miniconda3-latest-Linux-x86_64.sh回车到最后按照输入yes&#xff0c;之后按提示操作。 激活 conda activate如果没有反应或者返回&#xff1a; bash: conda: command not found则…...

Java 集合框架大师课:集合框架的暗黑料理(六)

&#x1f52e;Java 集合框架大师课&#xff1a;集合框架的暗黑料理&#xff08;六&#xff09;——弱引用与幽灵队列 第一章 弱引用&#xff1a;Java世界的塑料兄弟情 &#x1f494; 四大引用类型生死簿 // 四类引用生死实验 Object strongObj new Object(); …...

LVI-SAM、VINS-Mono、LIO-SAM算法的阅读参考和m2dgr数据集上的复现(留作学习使用)

ROS一键安装参考&#xff1a; ROS的最简单安装——鱼香一键安装_鱼香ros一键安装-CSDN博客 opencv官网下载4.2.0参考&#xff1a;https://opencv.org/releases/page/3/ nvidia驱动安装:ubuntu18.04 安装显卡驱动 - 开始战斗 - 博客园 cuda搭配使用12 cuda安装1&#xff1a;Ub…...

京鲁医疗健康专家委员会聊城专家团成立

3月13日由京鲁医疗健康专家委员会指导&#xff0c;聊城市委人才工作领导小组办公室、聊城市卫生健康委员会、聊城市人才引进服务中心主办的"智链医脉&#xff0e;新启未来"聊城卫生健康产才共融发展交流会在北京人卫酒店召开。会上&#xff0c;京鲁医疗健康专家委员会…...

MySQL的事务机制

事务 事务概念&#xff1a;事务是一个完整的操作单元&#xff0c;不可分割&#xff0c;事务中的操作要么全部成功&#xff0c;要么全部失败。 1. 事务特性 ACID 1.1 原子性&#xff08;A&#xff09; 一个事务中所有操作是不能被分割的&#xff0c;要么所有的操作都成功&am…...

30、Vuex 为啥可以进行缓存处理

Vuex 状态管理基础与缓存的关联 Vuex 的核心概念&#xff1a; Vuex 主要由五个部分组成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存储数据的地方&#xff0c;类似于一个全局的数据仓库。在这个菜谱 APP 的例子中&#xff0c;缓存的数…...

OpenAI Agents SDK 中文文档 中文教程 (5)

英文文档原文详见 OpenAI Agents SDKhttps://openai.github.io/openai-agents-python/ 本文是OpenAI-agents-sdk-python使用翻译软件翻译后的中文文档/教程。分多个帖子发布&#xff0c;帖子的目录如下&#xff1a; (1) OpenAI 代理 SDK&#xff0c; 介绍及快速入门 (2)Open…...

如何处理PHP中的文件上传错误

如何处理PHP中的文件上传错误 在Web开发中&#xff0c;文件上传是一个常见的功能需求。然而&#xff0c;文件上传过程中可能会遇到各种错误&#xff0c;如文件大小超出限制、文件类型不被允许、上传过程中断等。为了确保用户能够顺利上传文件&#xff0c;并且开发者能够有效地…...

mac安装python没有环境变量怎么办?zsh: command not found: python

在mac电脑上,下载Python安装包进行安装之后,在终端中,输入python提示: zsh: command not found: python 一、原因分析 首先,这个问题不是因为python没有安装成功的原因,是因为python安装的时候,没有为我们添加环境变量导致的,所以我们只需要,在.zshrc配置文件中加上环…...

湿大气校正效应

目的 修正由于大气中的水汽对雷达波传播速度的影响&#xff0c;以提高海面高度测量的准确性&#xff0c;有时候也叫做对流层校正。水汽的时空变化复杂&#xff0c;难以直接通过气象模型准确预测。水汽的折射作用使雷达信号的传播速度减慢&#xff0c;从而导致测量的海面高度虚增…...

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢&#xff1f;数独作为一款经典的逻辑游戏&#xff0c;其目标是在一个9x9的方格中填入数字1至9&#xff0c;确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单&#xff0c;但编写一个能够自动求解数独的程序…...

动态路径规划——01背包问题讲解和通过滚动数组优化

如果没有动态路径规划基础的兄弟可以出去了&#xff0c;这个题目有两个问题 第一问讲解&#xff1a; 1.定义状态表示 刚开始我做的时候根据我的经验定义了一个状态表示dp[i]表示从1到i个物品中选择的最大价值&#xff0c;但是这个状态表示有一个明显的问题&#xff0c;我怎么知…...

蓝队基本技能 web入侵指南 日志分析 后门查杀 流量分析

前言 为了赶工我是没学过红队的&#xff0c;首先我们要做的是 1、拿到用户给的web的时候 要先知道 web的源码 服务器 中间件 数据库这些信息 2、知道web日志放在哪里 会一些基本的分析 3、webshell查杀的基本技能 4、会分析基本的工具链 会写报告 .NET IIS 配置…...

docker基本应用和相关指令

文章目录 概要镜像管理容器操作网络管理数据卷管理其他常用指令典型场景示例小结 概要 Docker的命令通常分为几个大类&#xff0c;比如镜像管理&#xff08;images&#xff09;、容器管理&#xff08;containers&#xff09;、网络&#xff08;network&#xff09;、数据卷&…...

Django REST Framework中的序列化器类和视图类

序列化器类 一、Serializer序列化类 Serializer是DRF的序列化器基类&#xff0c;提供基本功能&#xff0c;使用Serializer类需要自己定义字段名称和类型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…...

模拟人生4大型MOD整合包3000+

存档介绍 &#xff08;懒人萌新必备&#xff09; 游戏内全面的人物美化、房屋改造、地图美化 美化人物250个&#xff08;颜值在线&#xff0c;均搭配八套服饰&#xff09; 全地图房屋改造&#xff08;住宅、公寓、公用/商业地段等&#xff09; 游戏内22张地图均已美化替换 存档…...

算法基础 -- Brian Kernighan 算法初识

Brian Kernighan 算法&#xff1a;利用 x & (x - 1) 逐步清除最低位的 1 1. 算法原理 x & (x - 1) 这个操作的作用是每次清除 x 的最低位的 1。由于 二进制的减法 会影响最低的 1&#xff0c;我们可以利用这一特性不断去除 1&#xff0c;直到 x 变为 0&#xff0c;从…...

基于Uniapp开发tab选项卡/标签栏前端组件

在开发一些业务场景时候&#xff0c;可能需要切换标签栏来展示不同的信息列表。 为此开发了一个Uniapp组件&#xff08;myTab&#xff09;&#xff0c;下面为组件的展示效果&#xff1a; 案例代码&#xff1a; <template><view class"content"><myt…...

双向广搜

从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_set<stri…...

2024下半年真题 系统架构设计师 论文写作 答案解析

系统架构设计师第二版VIP课程https://edu.csdn.net/course/detail/40283 试题一 论软件维护及其应用 请围绕“论软件维护及其应用”论题&#xff0c;依次从以下三个方面进行论述。 1.概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2.请介绍软件维护的内…...

【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor

插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个&#xff1a;shift单击没找到横向分布功能无法用键盘微调位置...

go中实现子模块调用main包中函数的方法

你提到的“import cycle not allowed”错误是 Go 语言中一个常见的问题&#xff0c;表示在包的导入中存在循环依赖。在 Go 中&#xff0c;一个包不能直接或间接导入自己&#xff0c;否则就会报这个错误。 在你提到的第二个例子中&#xff0c;main 包和 submodule 包相互导入&a…...

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...

java maven依赖传递以及版本冲突

文章目录 基本背景基本排查冲突工具依赖传递&#xff1a;很多依赖到底使用哪个版本的依赖dependencyManagement 作用exclusions其他问题 基本背景 你使用 java&#xff0c;使用 maven pom.xml 管理你的依赖包 可能常常遇到依赖版本冲突&#xff0c;或者很多依赖包&#xff0c;…...