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

第 3 章 -GO语言 基本语法

1. 注释

在编程中,注释是帮助理解代码的重要工具。Go语言支持两种类型的注释:

  • 单行注释:以 // 开头,直到行尾都是注释。
  • 多行注释:以 /* 开始,以 */ 结束,可以跨越多行。
示例
package mainimport "fmt"// 这是一个单行注释
func main() {fmt.Println("Hello, World!") // 这也是单行注释/*这是一个多行注释*/
}

2. 包管理

Go语言有一个强大的标准库,并且鼓励使用模块化的方法组织代码。每个Go程序都是由包(packages)组成的。一个包可以包含多个文件,这些文件共享相同的包名。

创建一个新的包

假设我们想要创建一个名为 mathutil 的包,它提供了一些数学运算的辅助函数。首先,我们需要在项目目录下创建一个与包同名的文件夹,然后在这个文件夹中编写代码。

mkdir mathutil
cd mathutil

然后,在 mathutil 文件夹中创建一个 .go 文件,例如 add.go:

package mathutil// Add takes two integers and returns their sum.
func Add(a int, b int) int {return a + b
}

3. 导入包

在Go中,如果要使用其他包的功能,必须先导入这个包。导入语句通常位于源文件的顶部,紧随包声明之后。

导入标准库包
package mainimport ("fmt"
)func main() {fmt.Println("Using the fmt package from the standard library.")
}
导入自定义包

假设我们已经创建了上面提到的 mathutil 包,现在我们可以在另一个文件或包中导入并使用它。

package mainimport ("fmt""./mathutil" // 相对路径导入自定义包
)func main() {result := mathutil.Add(5, 3)fmt.Printf("The result of adding 5 and 3 is %d\n", result)
}

注意:在实际开发中,推荐使用模块(modules)来管理依赖关系,而不是直接使用相对路径。可以通过运行 go mod init <module-name> 来初始化一个新的模块,这会创建一个 go.mod 文件来跟踪项目的依赖。

以上就是关于Go语言基本语法中注释、包管理和导入包的介绍。

当然,我们可以继续深入探讨Go语言中的更多细节,比如如何使用模块(modules)、如何处理错误、以及一些常见的编程模式等。接下来,我将详细介绍这些内容,并提供相应的代码示例。

4. 使用模块(Modules)

Go语言从1.11版本开始引入了模块(modules)来管理依赖。模块是一个包含一个或多个包的文件集,这些包通常共享同一个版本控制历史。

初始化模块

在你的项目根目录下,运行以下命令来初始化一个模块:

go mod init myproject

这会创建一个 go.mod 文件,该文件记录了项目的依赖关系。

添加依赖

当你在项目中导入外部包时,Go会自动下载并添加这些依赖到 go.mod 文件中。例如,如果你使用了 github.com/gin-gonic/gin 框架,只需要在代码中导入它:

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello, Gin!")})r.Run(":8080")
}

运行 go run main.go,Go会自动下载并安装 gin 框架及其依赖。

5. 错误处理

Go语言中的错误处理非常直观,通常使用 error 类型来表示错误。函数可以通过返回 error 来报告错误情况。

示例
package mainimport ("fmt""os"
)func readConfigFile(filename string) (string, error) {data, err := os.ReadFile(filename)if err != nil {return "", err}return string(data), nil
}func main() {content, err := readConfigFile("config.json")if err != nil {fmt.Println("Error reading file:", err)return}fmt.Println("File content:", content)
}

6. 常见编程模式

1. 函数式编程

Go语言虽然不是纯函数式编程语言,但你可以使用闭包和高阶函数来实现一些函数式编程的特性。

高阶函数示例
package mainimport "fmt"// 高阶函数:接受一个函数作为参数
func apply(f func(int) int, x int) int {return f(x)
}// 定义一个简单的函数
func double(x int) int {return x * 2
}func main() {result := apply(double, 5)fmt.Println("Result:", result) // 输出: Result: 10
}
2. 并发编程

Go语言的并发模型基于goroutines和channels。Goroutines是轻量级的线程,而channels用于在goroutines之间安全地传递数据。

Goroutines 和 Channels 示例
package mainimport ("fmt""time"
)func worker(id int, jobs <-chan int, results chan<- int) {for j := range jobs {fmt.Println("Worker", id, "started job", j)time.Sleep(time.Second)fmt.Println("Worker", id, "finished job", j)results <- j * 2}
}func main() {jobs := make(chan int, 100)results := make(chan int, 100)for w := 1; w <= 3; w++ {go worker(w, jobs, results)}for j := 1; j <= 9; j++ {jobs <- j}close(jobs)for a := 1; a <= 9; a++ {<-results}
}

7. 总结

通过上述示例,我们介绍了Go语言中的注释、包管理、导入包、模块管理、错误处理以及一些常见的编程模式。希望这些内容能帮助你更好地理解和使用Go语言。

当然,我们可以继续深入探讨更多的Go语言特性,包括结构体、接口、方法、类型断言、反射等高级主题。下面是一些更详细的示例和解释。

8. 结构体(Structs)

结构体是Go语言中用于组合数据的一种方式。结构体可以包含多个字段,每个字段都有自己的类型。

定义和使用结构体
package mainimport "fmt"// 定义一个结构体
type Person struct {Name    stringAge     intAddress string
}func main() {// 创建一个结构体实例p := Person{Name: "Alice", Age: 30, Address: "123 Main St"}// 访问结构体字段fmt.Println("Name:", p.Name)fmt.Println("Age:", p.Age)fmt.Println("Address:", p.Address)// 修改结构体字段p.Age = 31fmt.Println("Updated Age:", p.Age)
}

9. 方法(Methods)

方法是定义在特定类型上的函数。Go语言允许你在结构体上定义方法,这使得代码更加面向对象。

定义和使用方法
package mainimport "fmt"// 定义一个结构体
type Person struct {Name stringAge  int
}// 在结构体上定义一个方法
func (p Person) SayHello() {fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}func main() {p := Person{Name: "Alice", Age: 30}p.SayHello() // 调用方法
}

10. 接口(Interfaces)

接口是Go语言中实现多态的一种方式。接口定义了一组方法签名,任何实现了这些方法的类型都实现了该接口。

定义和使用接口
package mainimport "fmt"// 定义一个接口
type Speaker interface {Speak() string
}// 定义一个结构体
type Dog struct {Name string
}// 实现接口的方法
func (d Dog) Speak() string {return d.Name + " says Woof!"
}// 定义另一个结构体
type Cat struct {Name string
}// 实现接口的方法
func (c Cat) Speak() string {return c.Name + " says Meow!"
}func main() {var speaker Speakerspeaker = Dog{Name: "Buddy"}fmt.Println(speaker.Speak()) // 输出: Buddy says Woof!speaker = Cat{Name: "Whiskers"}fmt.Println(speaker.Speak()) // 输出: Whiskers says Meow!
}

11. 类型断言(Type Assertions)

类型断言允许你在运行时检查接口变量的实际类型。

使用类型断言
package mainimport "fmt"func main() {var a interface{} = "hello"// 类型断言s := a.(string)fmt.Println(s) // 输出: hello// 检查类型b, ok := a.(int)if !ok {fmt.Println("a is not an int")} else {fmt.Println(b)}
}

12. 反射(Reflection)

反射允许你在运行时检查和操作类型和值。Go语言的反射库 reflect 提供了强大的功能。

使用反射
package mainimport ("fmt""reflect"
)func main() {var x float64 = 3.4fmt.Println("Type of x:", reflect.TypeOf(x)) // 输出: Type of x: float64v := reflect.ValueOf(x)fmt.Println("Value of x:", v)                // 输出: Value of x: 3.4fmt.Println("Kind of x:", v.Kind())          // 输出: Kind of x: float64// 修改值v.SetFloat(5.6)fmt.Println("New value of x:", x)            // 输出: New value of x: 5.6
}

13. 总结

通过上述示例,我们介绍了Go语言中的结构体、方法、接口、类型断言和反射。这些特性使得Go语言在处理复杂问题时更加灵活和强大。希望这些内容能帮助你更好地理解和使用Go语言。如果你有任何问题或需要进一步的解释,请随时提问!

相关文章:

第 3 章 -GO语言 基本语法

1. 注释 在编程中&#xff0c;注释是帮助理解代码的重要工具。Go语言支持两种类型的注释&#xff1a; 单行注释&#xff1a;以 // 开头&#xff0c;直到行尾都是注释。多行注释&#xff1a;以 /* 开始&#xff0c;以 */ 结束&#xff0c;可以跨越多行。 示例 package maini…...

【qt】控件

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…...

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章

在现代化城市快速发展的背景下&#xff0c;安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展&#xff0c;智能化安防系统正逐步改变着传统的安全防护模式&#xff0c;特别是在行人入侵检测领域&#xff0c;视频智能分析平台Li…...

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

【设计模式】行为型模式(二):策略模式、命令模式

行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式 3.策略模式&#xff08;Strategy&#xff09;3.1 示例3.1.1 定义策略接口3.1.2 实现具体策略3.1.3 定义上下文类3.1.4 客户端代码3.1.5 输出结果 3.2 总结3.2.1 优点3.2.2 缺点 4.命令模式&#xff08;Com…...

STM32中断系统

目录 一、中断的基本概念 二、NVIC 1.NVIC的概念 2、NVIC的组成 3、NVIC的应用 4.NVIC的结构 三、外部中断EXTI 1.外部中断的概念 2.EXTI基本结构 四、EXTI外部中断的配置流程 1.开启APB2中的GPIO口/AFIO时钟 2.GPIO配置成输入模式 3.AFIO选择中断引脚 4.EXTI初始…...

window的Anaconda Powershell Prompt 里使用linux 命令

在 Windows 的 Anaconda Powershell Prompt 中使用 Linux 命令&#xff0c;可以通过以下几种方法来实现&#xff1a; 1. 使用 Git Bash 安装 Git for Windows 后&#xff0c;它会包含 Git Bash&#xff0c;允许在 Windows 上使用许多 Linux 命令。 步骤&#xff1a; 安装 Gi…...

Lisp 语言入门教程(一)

Lisp&#xff08;“LISt Processing”&#xff09;是一种古老而强大的编程语言&#xff0c;特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言&#xff0c;它启发了许多编程范式。以下是一个基础教程&#xff0c;帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...

Git - Think in Git

记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后&#xff0c;工作区 与其余三个区不同 当使用 add 将修改的代码暂存后&#xff0c;索引区与 工作区 相同 当使用 commit 将修改的代码提交后&#xff0c;仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测&#xff0c;由于是没有界面的&#xff0c;因此我们可以先在界面上把压测脚本写好&#xff1a; 如图&#xff1a;我这里简单的写…...

VL210-Q4 适用于USB延长线 扩展坞

VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies&#xff08;威盛电子&#xff09;生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能&#xff0c;适用于各种USB集线器应用&#xff0c;如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…...

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…...

OPENCV 检测直线[opencv--3]

opencv中集成了很多好用的函数&#xff0c;比如霍夫变换检测直线的函数&#xff0c;当然&#xff0c;考虑到看我文章的人水平&#xff0c;我这里只讲讲如何使用这个函数&#xff0c;和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…...

【MATLAB】目标检测初探

文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因&#xff0c;做了一个基于YOLOv5实现目标检测的程序&#xff0c;是基于Python做的&#xff0c;直接…...

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…...

厘清标准差和标准误:因果推断的统计学基础

标准差&#xff0c;指 一次抽样中 个体取值间的离散程度&#xff0c;反映了 个体取值对样本均值的代表性。 标准误&#xff0c;指 多次抽样中 样本均值间的离散程度&#xff0c;反映了 样本均值对总体均值的代表性。 公众号原文-厘清标准差和标准误&#xff1a;因果推断的统计…...

GESP4级考试语法知识(贪心算法(二))

排队接水2代码&#xff1a; #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…...

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量

命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…...

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表&#xff08;中等&#xff09; 8.12从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 8.13路径总和III&#xff08;中等&#xff09; 8.14二叉树的最近公共祖先&#xff08;中等&#xff09; 8.15二叉树中的最大路径和&#xff08;困…...

uniapp h5实现录音

使用npm安装 npm install recorder-core引入Recorder库 可以使用import、require、html script等你适合的方式来引入js文件&#xff0c;下面的以import为主要参考&#xff0c;其他引入方式根据文件路径自行调整一下就可以了。 //必须引入的Recorder核心&#xff08;文件路径是…...

字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)

Android 四大组件是什么? Android 四大组件分别是 Activity、Service、Broadcast Receiver 和 Content Provider。 Activity 是 Android 应用中最基本的组件,用于实现用户界面。它可以包含各种视图控件,如按钮、文本框等。一个 Activity 通常对应一个屏幕的内容。用户可以通…...

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…...

PSRR仿真笔记

1.首先打开bandgap的testbench电路&#xff0c;选择schematic 2.打开电路后,选择VDD模块&#xff0c;然后按键盘Q&#xff0c;进行编辑&#xff0c;将AC magnitude改为1 V 3.修改完成后&#xff0c;点击左上角Launch > ADE Explorer 4.在出现的窗口中&#xff0c;选择Creat…...

AUTOSAR_EXP_ARAComAPI的7章笔记(3)

☞返回总目录 相关总结&#xff1a;AutoSar AP简单多绑定总结 7.3 多绑定 如在 5.4.3 小节中简要讨论的&#xff0c;某个代理类 / 骨架类的不同实例之间的技术传输是不同的&#xff0c;多绑定描述了这种情况的解决方案。多种技术原因都可能导致这种情况出现&#xff1a; 代…...

WSADATA 关键字详细介绍

WSADATA 是 Windows Sockets API&#xff08;Winsock&#xff09;中用于存储 Winsock 库的初始化信息的结构体。在使用 Winsock API 之前&#xff0c;必须通过调用 WSAStartup() 函数进行初始化&#xff0c;WSADATA 结构体用于接收有关 Winsock 库版本的信息。Winsock 是 Windo…...

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III

Day44 | 动态规划 &#xff1a;状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 买卖股票的最佳时机【…...

Area-Composition模型部署指南

一、介绍 本模型可以通过输入不同的提示词&#xff0c;然后根据各部分提示词进行融合生成图片。如下图&#xff1a; 此图像包含 4 个不同的区域&#xff1a;夜晚、傍晚、白天、早晨 二、部署 环境要求&#xff1a; 最低显存&#xff1a;10G 1. 部署ComfyUI 本篇的模型部署…...

策略模式、状态机详细解读

策略模式 (Strategy Pattern) 策略模式 (Strategy Pattern) 是一种行为型设计模式&#xff0c;旨在将一组算法封装成独立的类&#xff0c;使得它们可以相互替换。这种模式让算法的变化不会影响到使用算法的客户&#xff0c;减少了类之间的耦合。策略模式通常用于处理一类问题&…...