Go语言基础

简介

Go语言(也称为Golang)是一种静态类型、编译型语言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年设计,首次公开发布于2009年。Go的设计初衷是解决当时谷歌内部面临的软件开发问题,特别是在处理大型服务器软件时的效率、并发和可靠性方面。Go语言结合了解释型语言的开发速度和编译型语言的性能,以及静态类型语言的安全性。它特别注重简洁、高效和易于理解的语法设计,旨在提高开发者的生产力。

主要特性

  • 静态类型和安全:Go是静态类型的语言,这意味着变量的类型在编译时就确定了,这有助于提前发现错误。
  • 并发模型:Go语言的并发模型是它的一大特色,通过goroutines(轻量级线程)和channels(用于goroutines间的通信)来实现并发编程,使并发更加容易理解和使用。
  • 标准库:Go拥有一个丰富的标准库,覆盖了网络、加密、数据处理等多个领域,这些库的设计和实现都非常注重性能和安全性。
  • 工具链:Go语言自带的工具链提供了编译、格式化代码、文档查看、性能分析等功能,这些工具的集成度很高,使得Go项目的构建和维护变得简单高效。
  • 跨平台编译:Go支持跨平台编译,开发者可以轻松地为不同的操作系统和架构编译程序。

使用场景

Go语言因其简洁、高效和强大的并发支持而广受欢迎,特别适合以下场景:

  • 云计算和微服务:Go语言在构建高性能、高并发的网络服务器和微服务方面表现出色。
  • 命令行工具:Go的编译型特性和丰富的标准库使其成为开发高效命令行工具的理想选择。
  • 分布式系统和网络服务:Go的并发模型和网络库使其非常适合开发分布式系统和网络服务。
  • 容器和基础设施工具:Go是Docker和Kubernetes等流行的容器和基础设施工具的开发语言,这些工具的成功也反过来推动了Go的普及。

Go语言基础

变量与类型

在Go中,变量是存储数据的容器,而类型是这些数据的蓝图,告诉Go如何处理这些数据。

变量声明

Go提供了多种声明变量的方式,最直接的方式是使用var关键字:

var name string = "Go语言"

但Go也支持类型推断,允许你在不显式声明类型的情况下初始化变量:

var name = "Go语言"

或者,使用短变量声明,这是在函数内部声明局部变量最常用的方式:

name := "Go语言"

数据类型

Go语言内置了多种数据类型,包括:

  • 基本类型intfloat64boolstring等。
  • 复合类型:如数组([3]int)、切片([]int)、映射(map[string]int)和结构体(struct)。
type Person struct {Name stringAge  int
}

函数

函数是执行特定任务的代码块。在Go中,通过func关键字来定义函数:

func greet(name string) string {return "Hello, " + name
}

Go支持多返回值,这在错误处理中尤其有用:

func divide(a, b float64) (float64, error) {if b == 0.0 {return 0.0, errors.New("division by zero")}return a / b, nil
}

控制结构

控制结构指导程序何时和如何执行代码块。Go支持的控制结构包括ifforswitch

If 语句

if语句用于基于条件的执行:

if num := 9; num < 0 {fmt.Println(num, "is negative")
} else {fmt.Println(num, "is non-negative")
}

For 循环

for循环是Go中唯一的循环结构,非常灵活:

for i := 0; i < 10; i++ {fmt.Println(i)
}

Switch 语句

switch语句用于替代多个if-else块:

switch os := runtime.GOOS; os {
case "darwin":fmt.Println("OS X.")
case "linux":fmt.Println("Linux.")
default:fmt.Println("Other.")
}

数组(Array)

数组是具有固定大小的元素集合。在Go中,数组的长度被视为类型的一部分,这意味着不同长度的数组是不同的类型。

var a [5]int // 声明一个含有5个整数的数组,默认值为0
b := [3]string{"Go", "Python", "Java"} // 使用数组字面量初始化

数组在Go中使用较少,主要是因为其固定长度的限制。然而,它们在性能敏感的应用中仍然有其价值。

切片(Slice)

切片是Go中最重要的数据类型之一,提供了比数组更强大的序列接口。切片是对数组的封装,支持动态扩展。

s := []int{1, 2, 3} // 使用切片字面量初始化,底层是数组
s = append(s, 4, 5) // 切片可以动态增长

切片的动态扩展特性,加上它对子序列的高效操作能力,使其成为处理序列数据的首选。

映射(Map)

映射是键值对的集合,也称为字典或散列表。在Go中,映射的键可以是任何可比较的类型,如整数、字符串。

m := make(map[string]int) // 使用make创建一个映射
m["Go"] = 1
m["Python"] = 2

映射的动态性使其非常适合于需要快速查找操作的场景。

结构体(Struct)

结构体是一种聚合数据类型,允许你将多个不同类型的项组合在一起。

type Person struct {Name stringAge  int
}p := Person{Name: "Alice", Age: 30} // 初始化结构体

结构体是Go中实现面向对象编程概念的基础,如封装(通过导出和未导出字段)和继承(通过嵌入结构体)。

使用场景

  • 数组:当你需要一个固定长度的集合时使用。
  • 切片:用于需要动态大小的序列,或需要频繁地增加、删除元素。
  • 映射:适用于需要快速键值对查找的场景。
  • 结构体:用于模拟现实世界中的对象或复杂的数据实体。

方法、接口和错误处理

方法(Methods)

方法是附加到特定类型上的函数。通过方法,Go允许你在类型定义上增加行为。方法的声明与函数类似,但在函数名之前增加了一个额外的参数,称为接收者(receiver),它指定该方法附加到的类型。

基本语法

type MyType struct {value int
}func (m MyType) GetValue() int {return m.value
}

在这个例子中,GetValueMyType类型的一个方法,它返回类型实例的value字段。

指针接收者 vs 值接收者

方法可以通过值接收者或指针接收者来声明。使用值接收者定义的方法在调用时使用值的副本,而指针接收者允许直接修改接收者指向的值。

func (m *MyType) SetValue(val int) {m.value = val
}

使用指针接收者的SetValue方法可以修改MyType实例的状态。

接口(Interfaces)

接口定义了一组方法签名的集合,任何类型只要实现了这些方法,就被认为实现了该接口。Go语言的接口实现是隐式的,不需要显式声明实现了哪个接口。

定义和实现

type Shape interface {Area() float64
}type Circle struct {radius float64
}func (c Circle) Area() float64 {return math.Pi * c.radius * c.radius
}

Circle通过实现Area方法隐式地满足了Shape接口。

错误处理(Error Handling)

在Go中,错误被视为常规值,使用error类型来表示。这种设计鼓励显式的错误检查,使错误处理更加清晰。

error接口

error是一个内置接口,定义如下:

type error interface {Error() string
}

创建和处理错误

func DoSomething() (int, error) {// 一个假设的错误场景return 0, errors.New("an error occurred")
}result, err := DoSomething()
if err != nil {// 错误处理log.Fatal(err)
}

在这个例子中,如果DoSomething函数遇到错误,它会返回一个错误值。调用者检查返回的错误值,根据错误值进行相应的处理。

总结

通过深入了解方法、接口和错误处理,你可以更加充分地利用Go语言的特性,编写出既灵活又健壯的应用程序。Go通过这些强大的特性,提供了一种清晰、简洁的方式来表达程序逻辑,使得代码易于理解和维护。

包管理

Go语言的包(package)系统不仅是代码组织的基础,也是Go生态系统中最强大的特性之一。正确地理解和使用包可以帮助你构建模块化、可维护和可复用的代码。本文将探讨Go中的包管理,包括如何组织代码、创建自定义包、使用第三方包,以及Go模块的使用。

组织代码

在Go中,每个包都是一个独立的命名空间,包含一组相关的Go源文件。一个好的实践是将功能相似或相关的代码放在同一个包中。

  • 一个目录一个包:Go语言的约定是一个目录下的所有Go文件都属于同一个包。包名通常是目录名,但也可以自定义。
  • 简洁的包名:选择简短、描述性的包名,避免使用通用词汇如util,这有助于代码的可读性。

创建和使用自定义包

创建自定义包只需要在你的Go项目中创建一个新的目录,并在该目录下添加Go文件。在文件的顶部,使用package关键字声明包名。

// 在 mypackage/mypackage.go
package mypackagefunc MyFunction() {// 函数实现
}

要使用这个包,只需在其他Go文件中使用import关键字导入它的路径。在Go模块中,这个路径是从模块根开始的完整路径

import "myproject/mypackage"func main() {mypackage.MyFunction()
}

使用第三方包

Go社区提供了大量的开源包,你可以通过go get命令轻松地添加这些包到你的项目中。

go get github.com/gin-gonic/gin

这将下载指定的包并将其添加到你的go.mod文件中,这样你就可以在项目中导入和使用这个包了。

Go模块

Go模块(Go Modules)是Go语言官方推荐的版本控制和包依赖管理解决方案。自Go 1.11版本以来,Go模块提供了一种在项目中管理依赖的机制。

  • 初始化模块:在项目根目录下运行go mod init <module name>,这将创建一个go.mod文件。
  • 管理依赖:当你使用go get添加依赖或构建项目时,Go会自动更新go.modgo.sum文件,记录项目的依赖。

小结

Go的包管理系统是其语言设计中的一个亮点,它鼓励开发者采用模块化和可重用的方式来组织代码。通过理解和运用Go的包和模块系统,你可以提高项目的结构清晰度和维护性。Go模块进一步简化了包的版本控制和依赖管理,使得处理大型项目和团队协作变得更加容易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sublime Text4代码配色自定义方案

文章目录 前言Settings设置效果图 前言 关于Sublime Text对于我的使用体验&#xff0c;只能说内置的代码主题真的都太low了&#xff0c;一点都不好看。所以接下来我分享一下我自定义代码配色。当然&#xff0c;大家也可以通过我给的中文翻译注释来自定义自己喜欢的颜色。废话不…

Linux 设置快捷命令

以ll命令为例&#xff1a; 在 Linux 系统上&#xff0c;ll 命令通常不是一个独立的程序&#xff0c;而是 ls 命令的一个别名。 这个别名通常在用户的 shell 配置文件中定义&#xff0c;比如 .bashrc 或 .bash_aliases 文件中。 要在 Debian 上启用 ll 命令&#xff0c;你可以按…

神经网络结构——CNN、RNN、LSTM、Transformer !!

文章目录 前言 一、什么是CNN 网络结构 解决问题 工作原理 实际应用 二、什么是RNN 网络结构 解决问题 工作原理 应用场景 三、什么是LSTM 网络结构 解决问题 工作原理 应用场景 四、什么是Transformer 网络结构 解决问题 工作原理 BERT GPT 前言 本文将从什么是CNN&#xff1…

一个完整的Flutter项目的基本构成

目录 1.页面跳转2.本地数据库和读取2.1 在pubspec.yaml中添加数据库框架依赖2.2 创建db.dart 初始化数据库并创建表2.3 安装JsonToDart插件2.4 创建实体类 user_bean.dart2.5 增删改查&#xff1a; 3.网络请求数据解析UI渲染 本篇主要总结下一个完整的Flutter项目有哪些基本构成…

徐工集团与宁夏天元锰业集团召开战略合作会议

2024年3月3日&#xff0c;徐工集团党委书记、董事长杨东升一行考察宁夏天元锰业集团&#xff0c;并举行战略合作会议。宁夏天元锰业集团董事局主席贾天将及相关高管参加会议。双方围绕绿色低碳、智能化和信息化推进新一轮机械设备“以旧换新”&#xff0c;物流运输和矿山开采设…

【SpringBoot3】Spring Boot Event 自定义事件的发布与监听

一、基本概况 1、什么是SpringBoot自定义事件 Spring Boot自定义事件是Spring框架中事件处理机制的一种扩展&#xff0c;它允许开发者在Spring Boot应用程序中定义、发布和监听自己的事件。这些事件可以用于在应用程序的不同组件之间进行通信&#xff0c;实现解耦和异步处理。…

VSCode通过SSH连接Docker环境进行开发

文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3 文章目录 前言一、创建controller相关二、编译测试三、测试运行测试forward_position_controller测试forward_velocity_controller测试forward_acceleration_controller总结前言 本篇文章在上篇文章的基础…

ThreadPoolExecutor 学习

ThreadPoolExecutor 是开发中最常用的线程池&#xff0c;今天来简单学习一下它的用法以及内部构造。 1、线程池存在的意义&#xff1f; 一般在jvm上&#xff0c;用户线程和操作系统内核线程是1&#xff1a;1的关系&#xff0c;也就是说&#xff0c;每次创建、销毁线程的时候&am…

day05-网络编程

1>广播 #include "test.h"#define SER_IP "192.168.42.106" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_DGRAM, 0);if(sfd -1){perror("socket error");return -1;}int broadcast 1; i…

Python基础:标准库 -- Time 时间的访问和转换

1. 官方文档 time --- 时间的访问和转换 — Python 3.12.2 文档 2. 准备知识 协调世界时 UTC (Coordinated Universal Time) 协调世界时&#xff08;Coordinated Universal Time&#xff0c;UTC&#xff09;&#xff0c;是一种国际标准的时间表示方式。UTC 是以原子钟为基础…

【代码】Python3|无GUI环境中使用Seaborn作图的学习路线及代码(阴影折线图)

我有个需求是需要画图&#xff0c;让GPT帮我生成了一下学习计划。 学习路线依照GPT的来的&#xff0c;使用的Prompt工具是https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor。 文章目录 PrerequisiteMain Curriculum1.1 Seaborn介绍Seaborn基础保存图形为文件练习 1.2 单变量数…

产品推荐 - GX-SOPC-5CEFA5-M484 FPGA核心开发板

● 核心板采用8层板精心设计 ● FPGA&#xff1a;采用Intel&#xff08;ALTERA&#xff09; Cyclone V 5CEFA5&#xff0c;Les为77K&#xff0c;内嵌存储器为4460Kb&#xff0c;硬件乘法器为300个&#xff0c;最大等效门数约2300万门&#xff1b;新增DSP Block&#xff08;150…

ssh远程登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

SSH登录提示 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).vi /etc/ssh/sshd_config PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes 重启ssh服务&#xff0c;并且设置开机自启服务systemctl restart sshd

pytorch项目代码记录

1.超过二维的张量写进csv #(20,204,273) -> (4080,273) ycsv []for i in range(20):ycsv.append(y[i, 8, :, :].reshape(204,273))with open(y.csv,w,encodingutf-8) as y_obj:writer csv.writer(y_obj)for j in range(20):writer.writerows(ycsv[j])data pd.read_csv(y…

STM32单片机-多串口printf()问题

目录&#xff1a; 一、概述 二、设置标志位选择需要的串口 三、更优解决方法 一、概述 printf()函数非常好用&#xff0c;但是重定义后只适用于单个串口&#xff0c;需要串口2使用printf()&#xff0c;需要重新定向。有关内容移步STM32关于printf重定向到串口。先贴一下双串…

Unity3D

一、C# 输入输出 二、三维数学

线性dp P1004 【方格取数】题解

代码比较简单的一题&#xff0c;重在思路&#xff08;除非写假了&#xff09; 传送门https://www.luogu.com.cn/problem/P1004 我的最初思路是两次二维dp&#xff0c;即贪心的取&#xff0c;用pre记录前一个位置&#xff0c;只有80pts&#xff0c;要是是在蓝桥拿分就可以跑路…

使用reduce递归获取有多层嵌套的数组中的children

常见的多层嵌套的数组&#xff0c;如下 const items [{id: 1,name: "item1",children: [{id: 11,name: "item11",children: [{id: 111, name: "item111"},{id: 112, name: "item112"}]},{id: 12,name: "item12",children:…

MySQL--优化(SQL语句执行慢,如何分析)

MySQL–优化&#xff08;SQL语句执行慢&#xff0c;如何分析&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、如何分析 聚合查询&#xff1a; 对于涉及大量数据的聚合操作&#xff0c;如果可能的…