Go语言入门
Go语言入门
简介
Go是一门由Google开发的开源编程语言,旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点,适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能,并通过示例代码和测试用例对其进行详细解释。
开始之前
让我们先来了解一下Go是什么,以及为什么我们选择学习它。
Go是由Google开发,用于处理大规模数据处理的静态强类型编译语言。Go拥有高效的运行速度,而且有助于节省处理器资源。因为Go语言特有的并行性,Go尤其适用于服务器编程和大数据处理。Go语言也被设计得非常明确,使得代码非常容易读懂。
我想再强调一遍Go的三个主要优点:第一,Go拥有一个强大而且明确的工具链。这使得Go语言非常容易被维护和测试。第二,Go语言有一个非常强大的并行和并发处理能力,使得Go非常适用于处理大数据。第三,Go语言是由Google支持和维护的,使得Go在处理大规模数据分析和服务器编程上有很大的优势。
OK,让我们开始吧。
安装Go
首先,我们需要在本地机器上安装Go编译器和相关工具。在Go官方网站(https://golang.org)上提供了各种操作系统的安装包,选择适合您操作系统的版本进行下载和安装。安装完成后,我们可以通过在终端中运行go version
命令来验证安装是否成功。
- Mac OS X 和 Linux 你可以使用下面的命令在你的终端中安装Go:
brew install go
- Windows 你需要去Go的官网下载安装包并安装。
一旦你已经安装了Go语言,你可以在终端中输入以下命令来确认是否成功:
go version
如果显示出了Go的版本信息,那么你已经成功了。现在,我们可以开始编写我们的第一个Go程序了。
Hello World
让我们从经典的Hello World程序开始。创建一个名为hello.go
的文件,并在其中输入如下代码:
package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}
保存文件后,我们可以在终端中执行以下命令来运行程序:
go run hello.go
输出结果将是:
Hello, World!
在你的一个.go
文件中输入以上代码,并用go run 文件名.go
命令运行它。你应该在终端中看到“Hello, World!”这个结果。
现在让我们来解构一下刚刚我们写的程序:
package main
这个声明了我们程序的包,main
包是所有Go程序的入口。import "fmt"
这个导入了一个叫做fmt
的包,我们可以通过这个包来进行控制台的输入输出。func main()
这个定义了我们的主函数,所有Go程序都从这个main
函数开始运行。fmt.Println("Hello, World!")
这个是我们实际输出“Hello, World!”的语句。
基本语法
变量
在Go中,我们可以使用var
关键词来定义一个变量:
var name = "John Doe"
这个定义了一个变量name
并且赋值为"John Doe"
。
常量
在Go中,我们可以使用const
关键词来定义一个常量:
const Pi = 3.14
这个定义了一个常量Pi
并且赋值为3.14
。
基本数据类型
Go语言提供了几种基本的数据类型,包括整数、浮点数、布尔值和字符串。下面我们将介绍这些数据类型的使用方法及其常见操作。
整数类型
在Go语言中,有多种整数类型,包括int8
、int16
、int32
、int64
、uint8
、uint16
、uint32
、uint64
,以及int
和uint
。其中,int
和uint
的大小与当前操作系统的位数相关。例如,在64位操作系统上,int
和uint
分别为int64
和uint64
。
下面是一个示例代码,演示了整数的声明和使用:
package mainimport "fmt"func main() {var a int = 10var b int64 = 20c := 30fmt.Println(a + int(b) + c)
}
输出结果将是:
60
浮点数类型
在Go语言中,浮点数类型包括float32
和float64
。默认情况下,Go会将浮点数视为float64
类型。下面是一个示例代码,演示了浮点数的声明和使用:
package mainimport "fmt"func main() {var a float32 = 3.14b := 6.28fmt.Println(a * float32(b))
}
输出结果将是:
19.7192
布尔类型
在Go语言中,布尔类型只有两个取值:true
和false
。下面是一个示例代码,演示了布尔类型的声明和使用:
package mainimport "fmt"func main() {var a bool = trueb := falsefmt.Println(a && b)
}
输出结果将是:
false
字符串类型
在Go语言中,字符串是以双引号包围的一串字符。下面是一个示例代码,演示了字符串的声明和使用:
package mainimport "fmt"func main() {var a string = "Hello"b := " World!"fmt.Println(a + b)
}
输出结果将是:
Hello World!
控制流程
Go语言提供了多种控制流程语句,包括条件语句、循环语句和跳转语句。下面我们将介绍这些语句的使用方法及其常见操作。
条件语句
条件语句用于根据不同的条件执行不同的代码块。Go语言中的条件语句有if
、else
和switch
三种形式。
下面是一个示例代码,演示了if
和else
语句的使用:
package mainimport "fmt"func main() {var a = 10if a > 0 {fmt.Println("a is positive")} else if a == 0 {fmt.Println("a is zero")} else {fmt.Println("a is negative")}
}
输出结果将是:
a is positive
循环语句
循环语句用于重复执行一段代码。Go语言中的循环语句有for
和range
两种形式。
下面是一个示例代码,演示了for
循环语句的使用:
package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Println(i)}
}
输出结果将是:
0
1
2
3
4
跳转语句
跳转语句用于在程序中跳转到指定的位置。Go语言中的跳转语句有break
、continue
和goto
三种形式。
下面是一个示例代码,演示了break
和continue
语句的使用:
package mainimport "fmt"func main() {for i := 0; i < 5; i++ {if i == 3 {break}if i == 1 {continue}fmt.Println(i)}
}
输出结果将是:
0
2
函数
在Go语言中,函数是一段可重复使用的代码块,用于执行特定的任务。函数可以有参数和返回值,也可以没有。
下面是一个示例代码,演示了函数的声明和调用:
package mainimport "fmt"func add(a, b int) int {return a + b
}func main() {result := add(3, 5)fmt.Println(result)
}
输出结果将是:
8
并发编程
Go语言通过goroutine和channel提供了原生的并发编程支持。goroutine是轻量级的执行线程,可以与其他goroutine并发执行。channel用于goroutine之间的通信。
下面是一个示例代码,演示了goroutine和channel的使用:
package mainimport "fmt"func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Println("Worker", id, "started job", job)// 模拟耗时的任务for i := 0; i < job; i++ {// do something}fmt.Println("Worker", id, "finished job", job)results <- job * 2}
}func main() {jobs := make(chan int, 100)results := make(chan int, 100)// 创建三个goroutine执行任务for i := 1; i <= 3; i++ {go worker(i, jobs, results)}// 发送一百个任务到jobs通道for i := 1; i <= 100; i++ {jobs <- i}close(jobs)// 输出结果for i := 1; i <= 100; i++ {<-results}
}
通过以上代码,我们可以看到三个goroutine并发执行了一百个任务,并且按顺序返回了结果。
测试
Go语言提供了内置的测试框架以及丰富的测试工具。我们可以通过编写测试用例来验证代码的正确性,并使用go test
命令执行测试。
下面是一个示例代码,演示了如何编写测试用例:
package mainimport "testing"func add(a, b int) int {return a + b
}func TestAdd(t *testing.T) {result := add(3, 5)if result != 8 {t.Errorf("Expected 8, but got %d", result)}
}
运行go test
命令将会执行测试,并输出结果:
PASS
ok _/path/to/package 0.001s
总结
本文介绍了Go语言的基础知识和常用功能,包括安装Go、Hello World程序、基本数据类型、控制流程、函数、并发编程和测试等方面。希望读者能通过本文对Go语言有一定的了解,并能在实际项目中灵活运用。
相关文章:
Go语言入门
Go语言入门 简介 Go是一门由Google开发的开源编程语言,旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点,适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能,并通过…...
Python学习笔记第五十五天(Pandas CSV文件)
Python学习笔记第五十五天 Pandas CSV 文件read_csv()to_string()to_csv() 数据处理head()tail()fillna() info() 后记 Pandas CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号…...

自然语言处理: 第七章GPT的搭建
自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后,大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构,其中以BERT系列为代表encoder-decoder架构,标准的tr…...

【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图
1.效果展示 最近ikun幻术图特别火啊,在网上能找到各种各样的ikun姿势图片,这些图片都是AI绘制的,能和风景完美融合在一起,今天小卷就来教大家怎么做这种图片 先看看图片效果 视频链接: 仿佛见到一位故人,…...

【深度学习】【风格迁移】Zero-shot Image-to-Image Translation
论文:https://arxiv.org/abs/2302.03027 代码:https://github.com/pix2pixzero/pix2pix-zero/tree/main 文章目录 Abstract1. Introduction相关工作3. Method Abstract 大规模文本到图像生成模型展示了它们合成多样且高质量图像的显著能力。然而&#x…...
Day 30 C++ STL 常用算法(上)
文章目录 算法概述常用遍历算法for_each——实现遍历容器函数原型示例 transform——搬运容器到另一个容器中函数原型注意示例 常用查找算法find——查找指定元素函数原型示例 find_if—— 查找符合条件的元素函数原型示例 adjacent_find——查找相邻重复元素函数原型示例 bina…...

MES系统在机器人行业生产管理种的运用
机器人的智能水平也伴随技术的迭代不断攀升。 2021年的春晚舞台上,来自全球领先工业机器人企业abb的全球首款双臂协作机器人yumi,轻松自如地表演了一出写“福”字,赢得了全国观众的赞叹。 在汽车装配领域,一台机器人可以自主完成一…...

Spark(39):Streaming DataFrame 和 Streaming DataSet 输出
目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch …...

【云原生】Docker 详解(一):从虚拟机到容器
Docker 详解(一):从虚拟机到容器 1.虚拟化 要解释清楚 Docker,首先要解释清楚 容器(Container)的概念。要解释容器的话,就需要从操作系统说起。操作系统太底层,细说的话一两本书都说…...
代码随想录第48天 | 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III
198. 打家劫舍 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 递归五部曲: dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。决定dp[i]的因素就是第i房间偷还是不偷。 如果偷第i房间&…...

【LeetCode】按摩师
按摩师 题目描述算法分析编程代码 链接: 按摩师 题目描述 算法分析 编程代码 class Solution { public:int massage(vector<int>& nums) {int n nums.size();if(n 0) return 0;vector<int> f(n);auto g f;f[0] nums[0];for(int i 1;i<n;i){f[i] g[i…...
国际腾讯云账号云核算概述!!
云核算概述 维基百科界说:云核算是一种依据互联网的新型核算方法,经过互联网上异构、自治的服务为个人和企业供给按需即取的核算。 云核算描绘的一起特征:云是一种按需运用的服务,运用者只重视服务本身。 云核算作为IT服务形式&am…...
.NET 6.0 重启 IIS 进程池
在 .NET 6.0 中,你可以使用 Microsoft.Web.Administration 命名空间提供的 API 来管理 IIS 进程池并实现重启操作。以下是一个示例代码,展示如何使用 .NET 6.0 中的 Microsoft.Web.Administration 来重启 IIS 进程池: using Microsoft.Web.A…...

一位心理学教师对ChatGPT的看法,提到了正确地使用它的几个要点
在没有自主学习能力和有自主学习能力的两类学生中,ChatGPT的出现,会加大他们在知识学习及思维发展上的鸿沟。爱学习的人会因为AI变得更好…… 从2022年年底起,ChatGPT的技术突破使人类终于进入了一个AI被广泛应用在工作、学习、生活的时代。…...

认识Node.js及三个模块
文章目录 1.初识 Node.js1.1 什么是 Node.js1.2 Node.js 中的 JavaScript 运行环境1.3 Node.js 可以做什么1.4 Node.js 环境的安装1.4.1 区分 LTS 版本和 Current 版本的不同1.4.2 查看已安装的 Node.js 的版本号1.4.3 什么是终端1.4.4 终端中的快捷键 1.5 在 Node.js 环境中执…...
49 | 公司销售数据分析
公司销售数据分析报告 本数据是2012~2014年间一家生产体育类产品的全球销售订单数据,分别按时间、产品类别、销售国家统计产品销售情况,分析销售额和利润额统计各产品市场占有份额,为下一步生产计划提供有价值的建议。 数据大小:88475 行, 11 列 Retailer country销售国…...

Android 项目导入高德SDK初次上手
文章目录 一、前置知识:二、学习目标三、学习资料四、操作过程1、创建空项目2、高德 SDK 环境接入2.1 获取高德 key2.2下载 SDK 并导入2.2.1、下载SDK 文件2.2.2、SDK 导入项目2.2.3、清单文件配置2.2.4、隐私权限 3、显示地图 一、前置知识: 1、Java 基…...
生成树协议用来解决网络风暴的问题?(第三十二课)
生成树协议用来解决网络风暴的问题?(第三十二课) 一 STP RSTP MSTP 介绍 STP(Spanning Tree Protocol)、RSTP(Rapid Spanning Tree Protocol)和MSTP(Multiple Spanning Tree Protocol)都是用于网络中避免环路的协议。 STP是最初的协议,它通过将某些端口阻塞来防止…...
git分支操作
Git分支的操作 1.1 Git分支简介 Git分支是由指针管理起来的,所以创建、切换、合并、删除分支都非常快,非常适合大型项目的开发。 在分支上做开发,调试好了后再合并到主分支。那么每个人开发模块式都不会影响到别人。 分支使用策略…...
【基础学习笔记 enum】TypeScript 中的 enum 枚举类型介绍
因为之前网上查好多博客都是只说最基础的,所以这里记录一下,最基础的放在最后面。 这里重点要记录的是枚举成员的值可以是字符串(字符串枚举,因为网上大部分只介绍常数枚举),需要注意的一点是,…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...