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

Go 第二期

探究技术的本质,享受技术的乐趣!这一期我们来聊聊Go中的数据类型,以及基本的逻辑结构。这一讲分为两个部分,第一部分,我先会和你谈谈我对类型的认知,然后谈谈Go中所支持的数据类型,第二部分,我会和你聊聊Go中提供的基本的逻辑结构,会更加侧重一些注意点,容易犯错的地方。那好,废话不多说,我们进入正篇

数据类型 In Go

类型的重要性

纵观全部的编程语言,除了较为底层的汇编语言外,无论是动态类型的编程语言,还是静态类型的编程语言,都有类型一说,可见类型这一语法元素的重要。那么类型究竟代表什么呢?如果你也有这个疑问,不妨听听我的答案。正如一个经典的公式:程序 = 数据 + 算法,算法我们暂且不谈,但是数据总归是需要存储在某个地方的,而运行中的程序,存储数据的地方自然是内存。我们知道操作系统通过内存隔离的手段保证的进程的独立性,也就是说每个进程的所使用的内存是不一样的,以此来保证程序的正确性。但是操作系统只保证了程序间内存的独立性,而程序内部的内存管理就只能依赖编程语言了,而编程语言的内存管理基本分为两大阵营,一类属于手动挡的需要程序员自己管理内存,一类属于自动挡,由垃圾回收器负责管理内存。

类型的作用

为了限制可以随便的对内存中的数据修改,编程语言引入类型,比如,int类型通常占用4个字节,那么以int类型定义的变量,能够任意操纵的内存大小就只有int类型规定的这四个字节,这样让程序内部使用的数据也似乎“隔离”了起来,各玩各的,互不打扰。正因如此,才使得编写一个好的程序容易起来。

Go 提供的数据类型

同其他编程语言一样,Go也提供了一些内置的数据类型,如果你学过多门编程语言,你会发现编程语言内置的数据类型就那么几种而已,无非就是 数字类型,字符类型,布尔类型,数组类型。不知道你是否有这样的疑问:为什么几乎所有的编程语言都只内置这几个基本类型。如果你现在还没有答案,不妨听听我的答案,因为内置的这几种数据类型通过相互组合足以对现实世界抽象建模。而在各个编程语言中组合这些基本类型的数据类型要么是结构体,要么是类。而Go的代码风格类C,所以提供组合这些基本数据类型的元素自然就是结构体。下面列举出常用的数据类型

  1. 整数类型 int家族
  2. 浮点数类型 float家族
  3. 复数类型 complex
  4. 字符串 string
  5. 字符类型 rune
  6. 数组类型 [len]type
  7. 切片类型 slice
  8. 映射类型 map

更加详细的数据类型相关的知识,可以参考官方文档 The Go Programming Language Specification - The Go Programming Language

逻辑结构 In Go

讲完了数据类型,按照“程序 = 数据 + 算法”这个公式,接下来我们看看Go中的逻辑结构,任何的算法到最后都是由顺序结构分支结构循环结构相互组合而成的。那么Go中提供了哪些语法元素来实现这些结构呢?又有哪些注意事项呢?

分支结构

分支结构有两种,一种为最为常见的if-else结构,一种是基于C改良后的switch结构,if-else结构无需多说,很简单,看看语法就好,和其他编程语言不通的是,它支持在判断之前声明变量。就像下面这样

if err := GetUserInfo(); err != nil {
    // 处理逻辑...    
}

而switch结构,主要用于基于值比较的分支中,但是在Go中,使用这种语法的多数是type switch, 具体可以参考文档 A Tour of Go ,使用分支结构还需要注意变量的作用域问题,如果感兴趣,后面详细聊聊。

循环结构

在Go中,循环结构只有一种,即for 结构,除了传统的for循环,还支持for range,针对for-range这种循环方式,存在几个坑,第一就是变量复用的问题,第二就是遍历的是浅拷贝后的集合

for index,data := range nums {
    // 处理逻辑...
}

比如上面这段代码,我们遍历的不是nums,而是nums的副本,其次就是 := 本为声明变量的用法,但是这里会出现变量重用,而不是反复声明。

总结

今天,我们梳理了一下Go的数据类型以及逻辑结构的基本语法,如果你想学习到更加具体的内容可以参考官方文档 https://go.dev/tour/welcome/1


http://www.kler.cn/news/316362.html

相关文章:

  • 界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等
  • (已解决)vscode如何选择python解释器
  • 【学习笔记】SSL/TLS安全机制之HSTS
  • apt-get install 安装的tomcat配置
  • biopython提取.cif文件的变换矩阵
  • spring全家桶使用教程
  • Kotlin 操作符 in 的基本使用(十)
  • docker存储
  • 2.《DevOps》系列K8S部署CICD流水线之部署NFS网络存储与K8S创建StorageClass
  • 2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序
  • Python基础学习(3)
  • SpinalHDL之结构(二)
  • rabbitmq整合skywalking并编写自定义插件增强
  • 超详图解 Apache HTTP Server(httpd)安装与验证
  • 设计模式 享元模式(Flyweight Pattern)
  • 『功能项目』QFrameWorkBug修改器界面【65】
  • 数据结构(十四)——HashMap与HashSet(OJ题)
  • Git 提交规范
  • Flyway 数据库差异处理
  • 机器人速度雅可比矩阵求解(2自由度平面关节机器人)
  • Perl 进程管理
  • 【Nginx-Location-Root】最终访问的路径是 root/$uri
  • 程序员锤炼核心竞争力的五重策略
  • 《Linux基础》练习操作
  • Redis中的setnx的使用场景
  • 2024年中国科技核心期刊目录(自然科学卷)科技统计源核心(续)
  • 网络通信——路由器、交换机、集线器(HUB)
  • 【深度学习】(5)--搭建卷积神经网络
  • 【matlab】读取rhd文件格式,intan脑电采集开源代码
  • go语言 结构体