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/718226.shtml

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

相关文章

百度文库旋转验证码识别

最近研究了一下图像识别&#xff0c;一直找到很好的应用场景&#xff0c;今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好&#xff0c;下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫&#xff0c;对验证码图片进行采…

区块链媒体发布推广10个热门案例解析-华媒舍

区块链技术的发展已经引起了媒体的广泛关注&#xff0c;越来越多的区块链媒体纷纷发布推广相关的热门案例。本文将介绍10个成功的区块链媒体推广案例&#xff0c;并分享它们的成功秘诀&#xff0c;帮助读者更好地了解区块链媒体推广的方法与技巧。 随着区块链技术的成熟和应用场…

第二证券:富时罗素扩容 A股引入国际增量资金

日前&#xff0c;英国富时罗素指数公司&#xff08;FTSE Russell&#xff0c;简称“富时罗素”&#xff09;公布的全球股票指数&#xff08;FTSE Global Equity Index Series&#xff09;半年度指数检查陈述显现&#xff0c;将新调入A股76只、调出1只。此前&#xff0c;富时罗素…

Leetcode 3049. Earliest Second to Mark Indices II

Leetcode 3049. Earliest Second to Mark Indices II 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3049. Earliest Second to Mark Indices II 1. 解题思路 这道题我看貌似难度报表&#xff0c;比赛的时候貌似只有36个人搞定了这道题目&#xff0c;然后最快的人…

【LeetCode】升级打怪之路 Day 12:单调队列

今日题目&#xff1a; 239. 滑动窗口最大值 | LeetCode 今天学习了单调队列这种特殊的数据结构&#xff0c;思路很新颖&#xff0c;值得学习。 Problem&#xff1a;单调队列 【必会】 与单调栈类似&#xff0c;单调队列也是一种特殊的数据结构&#xff0c;它相比与普通的 que…

Get Your Back Covered! Coverage, CodeCov和Tox

1. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测试过,哪些没有。 coverage.py …

Arm平台下各种memcpy优化对比<二>

因memcpy导致tda4vm上的h264解码占CPU较高而改弃&#xff0c;从网上找到各种memcpy的优化代码&#xff0c;在一起做了个运行速度对比&#xff0c;请查收&#xff1b; #include <stdio.h> #include <stdlib.h> /* rand, srand */ #include <string.h> #i…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…

【数据结构】B树

1 B树介绍 B树&#xff08;英语&#xff1a;B-tree&#xff09;&#xff0c;是一种在计算机科学自平衡的树&#xff0c;能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作&#xff0c;都在对数时间内完成。B树&#xff0c;概括来说是一个一般化的…

MySQL高可用性攻略:快速搭建MySQL主从复制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主从复制集群 &#xff01; MySQL基础知识&#xff1a;介绍MySQL数据库的基本概念和常用命令&#xff0c;如何创建数据库、表、用户和权限管理等。 MySQL安装教程&#xff1a;Centos7 安装MySQL5.7.29详细安装手册 MySQL数据类型&…

【大厂AI课学习笔记NO.63】模型的维护

说是模型的维护&#xff0c;其实这堂课都是在讲“在工业环境中开发和部署机器学习模型的流程”。 上图来自于我的笔记思维脑图&#xff0c;已经上传&#xff0c;要链接的访问的主页查看资源。 一路走来&#xff0c;我们学习了数据管理、模型学习、模型验证、模型部署等重要的步…

arm板运行程序时寻找动态库的路径设置

问题&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一种方法---- 解决&#xff1a; ①复制需要用到的arm库到板子上。 ②pwd指令获取该库的绝对路径&#xff0c;把路径复制到/etc/ld.so.conf文件 ③输…

Leetcoder Day37| 动态规划part04 背包问题

01背包理论基础 面试掌握01背包&#xff0c;完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

隐式马尔科夫算法

隐式马尔科夫算法 隐式马尔科夫算法概述算法使用HMM 模型参数设置HMM 模型分类1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他机器学习算法&#xff1a;机器学习实战工具安装和使用 隐式马尔科夫算法概述 隐式马尔科夫算法是一种用于处理时序数据的强大工具&#xff0c;其…

css通过calc动态计算宽度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我开发的chatg…

计算机二级(Python)真题讲解每日一题:《字典字符查找》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 在右侧的答题模板中&#xf…

Crash 实例

1.spinlock原理 为了解决这个spinlock的不公平问题&#xff0c;linux 2.6.25内核以后&#xff0c;spinlock采用了一种"FIFO ticket-based"算法的spinlock机制&#xff0c;可以很好的实现先来先抢占的思想。具体的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用&#xff0c;然后介绍其内存结构。最后&#xff0c;补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

[项目设计] 从零实现的高并发内存池(一)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 前言 项目介绍 1.内存池 1.1 什么是内存池 池化技术 内存池 1.2 为什…

word使用bib添加参考文献

文章目录 安装TexLive安装bibtex4word使用在word中添加参考文献使用bibtex4word在word中添加参考文献设置参考文献格式为毕业论文格式 参考 安装TexLive 从下载地址下载镜像iso文件texlive2023.iso双击打开iso镜像文件运行 install-tl-windows.bat点击安装非常非常非常耐心地安…