【Go语言圣经3.1】

go语言圣经(中文)高清彩色版 go语言圣经(中文),根据最新gibbook,2019年3月构建 立即下载

目标

  • 复习二进制基础:包括如何进行二进制、八进制、十六进制转换,理解计算机如何存储数据。
  • 了解两的补码:这是理解有符号数表示及溢出的关键。
  • 掌握类型系统与类型转换:明确不同类型间不能直接运算、需要显式转换的原因,以及可能引发的数据截断问题。
  • 多写一些简单的位运算代码:通过实践掌握位掩码、移位操作和按位逻辑运算在解决实际问题(如集合操作、数据压缩、加密等)中的应用。
  • 关注格式化输出:学会使用 fmt.Printf 的各种格式化动词,帮助你更直观地看到数据的二进制和其他进制表示形式。

概念

  1. 明确大小的整数类型

    • 有符号整数:
      • int8:8 位,范围 -128 到 127
      • int16:16 位,范围 -32768 到 32767
      • int32:32 位,范围 -2³¹ 到 2³¹-1
      • int64:64 位,范围 -2⁶³ 到 2⁶³-1
    • 无符号整数:
      • uint8:8 位,范围 0 到 255
      • uint16:16 位,范围 0 到 65535
      • uint32:32 位,范围 0 到 2³²-1
      • uint64:64 位,范围 0 到 2⁶⁴-1
  2. 平台相关的整数类型

    • int 与 uint:
      这两种类型的大小由编译器根据目标平台确定,可能是 32 位或 64 位。由于其大小不固定,所以在跨平台代码中要特别小心,不应假设其具体大小。
  3. 特殊类型:rune、byte、uintptr

    • rune:

      实际上是 int32 的别名,主要用于表示 Unicode 字符。
      使用 rune 可以清晰地表明变量的用途是存储一个字符,而非一个简单的数字。

      • Unicode 是一个国际标准,旨在为全球所有语言中的字符分配唯一的数字编号,从而实现跨语言、跨平台的文本处理。
      • 每个字符在 Unicode 标准中都有一个唯一的码点,通常用 U+ 后跟十六进制数字表示。例如,大写字母 A 的码点是 U+0041,中文字符“国”的码点是 U+56FD。
      • UTF-32:每个码点固定使用 4 个字节,直接对应 Go 中的 rune 类型(即 int32)。这种方式虽然内存使用较多,但每个字符的长度一致,处理起来比较简单
    • byte:

      是 uint8 的别名,用于强调该数值代表一个原始字节,而不是一个小整数。

    • uintptr:

      是一种无符号整数类型,足够大到可以存放指针值,主要用于底层编程(如与 C 语言库、操作系统接口交互)。

  4. 数值的二进制表示:计算机内部一切以二进制存储,一个整数由若干 bit 组成。

  5. 两的补码表示

    • 有符号数:

      在大多数编程语言中,包括 Go,负数采用两的补码表示。对于一个 n-bit 的数,其值域是:

      • 最小值:-2^(n-1)
      • 最大值:2^(n-1)-1
        例如,int8 的范围是 -128 到 127。
    • 无符号数:

      所有位都用于表示数值,范围为 0 到 2^n - 1。例如 uint8 的范围为 0 到 255。

  6. Go 语言中提供的运算符包括:

    • 算术运算符:+、、、/、%
    • 逻辑运算符:&&、||
    • 比较运算符:==、!=、<、<=、>、>=
    • 位运算符:&(与)、|(或)、^(异或,亦可用作一元按位取反)、&^(按位清零)、<<(左移)、>>(右移)
  7. 运算符结合赋值

    • 对于算术运算符,Go 还提供复合赋值形式,如 +=、-= 等,这使得代码更加简洁。
  8. 整数除法与模运算

    • 整数除法:

      当两个整数相除时,结果向零截断(丢弃小数部分),例如 5/4 得到 1。

    • 模运算(%):

      仅适用于整数,且在 Go 中模运算的结果的符号与被模数相同,即使除数为负数,-5 % 3 与 -5 % -3 均得 -2。

  9. 基本位运算

    • &:按位与
    • |:按位或
    • ^:按位异或(作为一元运算符时表示取反)
    • &^:按位清零(如果 y 对应位为 1,则结果为 0,否则为 x 对应位的值)
  10. 移位操作

    • 左移(<<):
      相当于乘以 2 的 n 次方,左边的空位用 0 填充。
    • 右移(>>):
      对无符号数右移同样用 0 填充;而有符号数右移时会根据符号位来决定是否填充 0 或 1(这称为符号扩展)。
  11. 字符表示

    • 字符面值用单引号表示,例如 'a' 或 '国'。
    • 字符可以使用 %c 进行打印,或者 %q 打印成带单引号的格式。

要点

溢出 wrap-around

如果运算结果超出变量能表示的范围,多出的高位会被截断。
例如,对于 uint8 类型

var u uint8 = 255
fmt.Println(u, u+1, u*u) // 输出 "255 0 1"

类型转换与类型安全

Go 语言强调类型安全,不同的整数类型不能直接进行运算,即使它们底层可能具有相同的位数。例如:

var apples int32 = 1
var oranges int16 = 2
// var compote int = apples + oranges // 编译错误,类型不匹配
var compote = int(apples) + int(oranges) // 显式转换后才能相加
  • 静态类型语言要求显式转换
    • 在 Go 语言中,转换语法为 T(x),其中 T 是目标类型,x 是要转换的值。
    • 隐式转换可能会在不经意间导致数据丢失或逻辑错误。例如,将一个较大范围的数据隐式转换成较小范围的类型,可能截断高位数据。显式转换要求开发者明确表明“我知道转换可能带来风险”,从而降低错误风险。
    • 静态类型语言(如 Go)的编译器在编译时就会检查类型一致性。如果允许隐式转换,编译器可能无法捕捉到所有潜在的类型错误。
  • 从大类型转换到小类型时,可能会丢失数据或精度。
  • 浮点数转换为整数时,会截断小数部分并向零截断,例如 int(3.141) 得 3。

数值的进制格式

使用 fmt.Printf 时,可以用不同格式化动词控制输出格式:

  • %d:十进制
  • %o:八进制
  • %x / %X:十六进制
  • %08b:二进制,至少 8 位,不足补 0

例如:


o := 0666
fmt.Printf("%d %[1]o %#[1]o\n", o) // 输出 "438 666 0666"

这里 %[1] 表示重复使用第一个操作数,# 前缀表示在八进制和十六进制输出时添加前缀(如 0 或 0x)。

语言特性

总结与补充

两的补码

你有一个数字钟表,比如钟表上标有数字0到11。当你往前走时,比如从10走2步,就会变成0。两的补码就利用了这种“绕圈”的特性,把数字“绕回来”来表示负数。

“两的补码”这个名字来源于它表示负数的方法:在二进制中,用一种方法把一个正数变成它的负数,而这个方法实际上就是用“2的幂”来做补数。因为2^n的基础是2,所以这种方法叫做两的补码。

假设我们用8位二进制来表示数字,负数的表示其实就是“2^8减去正数”。比如-5此时是256-5

用反转加1的方法,实际上就是找出一个数,它和正数相加正好等于2^n,这个数我们就称为正数的“补数”。

设我们用 n 位二进制数表示一个整数 x,那么所有 n 位全为 1 的数就是 2ⁿ–1。在这种表示下,对 x 取反(即每一位 0 与 1 互换)得到的数,就是:

~x = (2ⁿ – 1) – x

接下来,我们对 ~x 加 1:

~x + 1 = (2ⁿ – 1 – x) + 1 = 2ⁿ – x

因此,有:

x + (~x + 1) = x + (2ⁿ – x) = 2ⁿ

想象你有一盒糖果,一共有256颗糖(这就像2^8)。如果你有5颗糖,那么剩下的糖数(256 - 5)就是你没有的糖。两的补码就像告诉你,“为了表示-5,我们实际上在表示‘从256里拿走5颗糖’的结果。

用二进制表示集合/构造集合(能够去重)

  • 集合与位的对应关系

    想象有一个小盒子,每个盒子中的位置(位)对应一个元素。如果某个位置为1,就表示集合中包含对应的元素;如果为0,则不包含。

    • 例如,数字 00100010 表示第1位和第5位为1,可以看作集合 {1, 5}。
  • 构造集合

    使用位运算“或”(|)可以将多个单一元素“合并”为一个集合:

    
    var x uint8 = 1<<1 | 1<<5  // 1<<1 产生 00000010,1<<5 产生 00100000,或运算后得 00100010
    

    同理,

    var y uint8 = 1<<1 | 1<<2  // 结果为 00000110,表示集合 {1, 2}
    

测试集合成员资格

  • 位与运算

    用“与”(&)运算符可以检测两个集合的交集,或者检测一个特定元素是否在集合中。

    • 在示例中,x & y 对应的运算是:
      • x 为 00100010
      • y 为 00000110
      • 逐位与运算后,只有第二位(从右数,位1)同时为1,所以结果为 00000010,代表集合交集 {1}。
  • 测试某个元素是否存在

    如果要检测集合 x 是否包含元素 n,可以这样写:

    
    if x & (1 << n) != 0 {
        // 表示元素 n 存在于集合 x 中
    }
    

    这里 (1 << n) 就构造了只有第 n 位为1的掩码,和 x 进行与运算后,如果结果不为0,则说明该位在 x 中也为1,即元素 n 存在。

Go语言圣经 简体中文版 网上找遍了,都是繁体中文的,我下载下来转换为简体中文了,可能偶有几个字符没有转换成功但不影响阅读。 立即下载

相关推荐

Amesim管路仿真进阶:如何用阻力管实现不规则管路的高精度模拟

本文深入探讨了在Amesim仿真中,如何利用阻力管(Orifice with Table)元件,特别是TFORT0子模型,实现对不规则管路的高精度模拟。通过直接输入基于测试或CFD的流量-压降数据,该方法能有效弥补标准管路模型在复杂流道、内部结构复杂等场景下的不足,为液压、热管理等系统仿真提供精准可靠的部件模型。

cicd6pipeline的博客 670

Go语言圣经(中文版)

http://golang-china.github.io/gopl-zh/index.html

dazheng 1万+

模型性能评估之 Friedman 检验与 Nemenyi 后续检验

前言 当我们提出一种算法,需要知道我们的算法和现在已有的算法相比,性能是否更优的时候,就需要用到模型性能评估的方法。本篇博客介绍一种模型性能评估的方法:Friedman 检验与 Nemenyi 后续检验。 该方法的特点是:可以进行多个算法的比较。下面看看具体的使用: 具体使用 1. 计算序值 假定我们用 D1D_1D1​、D2D_2D2​ 、D3D_3D3​ 和 D4D_4D4​ 四个数据集对算法 AAA、BBB、CCC 进行比较。首先需要得到每个算法在每个数据集上的测试结果,可以是准确率,也可以是均方误差

蕾欧娜与26的博客 1万+

Go语言圣经(中文版)读书笔记

首先感谢作者译者,让我们见识到了如此好的文章。 1. 入门 Hello,World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL WEB服务 本章重点 2.程序结构 命名 声明 变量 赋值 类型 包和文件 作用域 3.基础数据类型 整型

shen19910922的博客 1387

Bybit面经

这段总结描述了求职者在Bybit面试过程中的经历和相关问题,包括面试内容、求职者向面试官提问的问题以及关于Bybit的信息

郑泽洲的博客 2579

手把手教你用开源EtherCAT协议栈SOEM开发从站设备(附避坑指南)

本文详细介绍了如何使用开源EtherCAT从站协议栈SOES进行嵌入式设备开发。内容涵盖从环境搭建、硬件准备到核心的对象字典与PDO映射配置,并重点分享了主循环集成、状态机处理以及实战调试中的常见问题与避坑指南,旨在帮助开发者高效实现设备接入工业现场总线网络。

linux的博客 625

Go语言圣经(中文版)读书笔记(一)

这本书的第一章还是比较常规的,一照面依然是令人感动的Hello World。package mainimport "fmt"func main() { fmt.Println("Hello, 世界") }获取各章源代码

shen19910922的博客 824

基于STM32设计的数字电子秤

当前项目是采用采用STM32+称重模块+OLED实现了简单的电子秤项目,称重模块上采用24位的ADC芯片,精度较高。实现了称重,校准、去皮等功能。

1万+

Go语言开发必读书目,从菜鸟到大牛必备

Go语言是最近几年流行起来的语言,该语言有谷歌发明,并得到广泛的应用。Go语言最大的特点是并发支持度好,而且开发效率高。在C语言中需要几十行,上百行代码才能实现的功能,在Go语言中可能只需要几行代码就可以搞定。因此,目前很多人开始学习Go语言进行开发。Go语言的应用领域也很广,包括服务端的开发,Web开发和应用开发等等。下面本文推荐几本Go语言入门必读的图书。 Go语言程序设计 这本书是Go语言入...

shuningzhang的专栏 7228

【3天快速入门WPF】11-附加属性

创建一个静态类,用于定义附加属性。使用方法注册附加属性。提供Get和Set方法来获取和设置附加属性的值。通过以上步骤,我们可以在WPF中轻松实现和使用附加属性。附加属性的主要用途包括为控件添加自定义行为、控制布局信息(如Grid.Row和)以及实现动态样式。

Zy100Papa的博客 679

智能工厂评估模型研究

摘要:通过对国内外现有智能制造评估模型的研究,结合重庆制造业行业领跑者与落后者之间差距大的现状,以实现全要素全连接的数字化工厂为出发点,融合工业互联网标识,构建实践可行的智能工厂评估模型推动中小型企业参与智能制造转型,缓和两极分化问题。本评估模型包含工厂体系架构的3个层级,提供用于推动智能制造转型的参考,包括设计、生产、管理的全过程评估。关键词:智能制造评估模型;智能制造转型;全连接工厂;工业互联网标识0 引言受行业需求与技术创新的影响,全球制造业在历经了工业1.0机械化、工业2.0电气化和工业3.0自动

罗伯特技术屋 677

【go语言圣经1.3】

标准化输出 format格式化动词%d 十进制整数%x, %o, %b 十六进制,八进制,二进制整数。%f, %g, %e 浮点数: 3.141593 3.141592653589793 3.141593e+00%t 布尔:true或false%c 字符(rune) (Unicode码点)%s 字符串%q 带双引号的字符串"abc"或带单引号的字符'c'%v 变量的自然形式(natural format)%T 变量的类型%% 字面上的百分号标志(无操作数)转义字符。

Pyroyster的博客 882

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

【go语言圣经】练习1.1-1.3

描述: 做实验测量潜在低效的版本和使用了 strings.Join 的版本的运行时间差异。描述:修改 echo 程序,使其能够打印 os.Args[0] ,即被执行命令本身的名字。节讲解了部分 time 包,11.4节展示了如何写标准测试程序,以得到系统性的性能评测。PS:运行了几次,大概是方式一消耗的时间多一点,但是直接测试时间并不精确。新建了一个xxx_test.go文件,必须跟xxx.go文件在同一目录。描述:修改 echo 程序,使其打印每个参数的索引和值,每个一行。

yj1248805281的博客 537

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Go语言圣经 - 第1章 入门 - 1.3 & 1.4 查找重复的行 & GIF

第1章 入门 1.3 查找重复的行 在1.2节,我们简单的了解了一些Go语言的基本语法,接下来我们再来看一个例子进一步学习 对文件做拷贝、打印、搜索和排序、统计或类似事情的程序都有一个差不多的程序结构:一个处理输入的循环,再每个元素上执行计算处理,在处理的同时或最后产生输出。我们来通过一些案例深入理解下这种程序结构 case 1: func main() { counts := make(map[string]int) input:= bufio.NewScanner(os.Stdin)

weixin_51487151的博客 314

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

《Go语言圣经练习题》

【代码】《Go语言圣经练习题》

weixin_43495948的博客 524

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【go语言圣经】练习答案--第三章

练习 3.1: 如果f函数返回的是无限制的float64值,那么SVG文件可能输出无效的多边形元素(虽然许多SVG渲染器会妥善处理这类问题)。修改程序跳过无效的多边形。 package main import ( "fmt" "math" ) const ( width, height = 600, 320 //画布大小 cells = 100...

金戋的博客 2677

Go语言圣经总结

如果没有足够的增长空间的话,appendInt函数则会先分配一个足够大(2*len(old_slice),这个扩容算法因不同语言不同)的slice用于保存新的结果,先将输入的x复制到新的空间,然后添加y元素。当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是一个复制的副本,并不是原始调用的变量。因为函数参数传递的机制导致传递大的数组类型将是低效的,并且对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。

yelvens的博客 2058

Go语言圣经

第一章入门

kwdecsdn的博客 2754

【Go语言圣经2.3】

函数中返回局部变量地址:在 Go 中,返回函数中局部变量的地址是安全的,因为编译器会根据逃逸分析决定将该变量分配在堆上。每个变量在内存中都有一个地址。变量的生命周期决定了它们在内存中存在的时间长短,而作用域决定了变量在代码中可以被访问的范围。对同一变量取地址或复制指针,都为该变量创建了新的别名,通过 *p 访问到的就是同一个变量的值。会创建一个 T 类型的匿名变量,将其初始化为 T 的零值,并返回其地址(类型为 *T)。如果同一词法域中已有部分变量存在,那么“:=”会对已有变量进行赋值,同时声明新的变量。

Pyroyster的博客 2044

Go学习圣经:0基础精通GO开发与高并发架构(1)

从Java高薪岗位和就业岗位来看,云原生、K8S、GO 现在对于 高级工程师/架构师来说,越来越重要。尼恩从架构师视角出发,基于自己的尼恩 3高架构师知识体系和知识宇宙,写一本《GO学习圣经》。

架构师尼恩 4753

go语言圣经读书笔记(上)

总而言之,go总结了很多厉害语言经验,由大佬们组队创造的,如图。

weixin_56551472的博客 1971

《Go语言圣经》笔记(1-4章)

一、入门 1、hello world Go不需要加分号 “{” 符号必须和关键字func在同一行,不能独自成行。并且在 x+y 这个表达式中,换行符可以在+操作符的后面,但是不能在+操作符的前面 为了在一个包下的多个文件能同时编写main方法,可以在无用的文件前面加 //go:build ignore // +build ignore 2、 命令行参数 os包提供一些函数和变量。命令行参数以os包中Args名字的变量供程序访问,在os包外面,使用os.Args这个名字。变量os.Args是一个字符串

shenxinde的博客 5162

【Go语言圣经3.6】

iota 常量生成器:iota 是一个强大的工具,可以方便地生成有规律的数值序列,适用于枚举、位标志、以及其他有序数值集合的定义。有一类常量称为“无类型常量”,这类常量在声明时不被赋予一个具体的基础类型,而是保持一种更“通用”的状态。这样做有两个好处:更高精度的运算:无类型常量在算术运算中拥有比具体类型(如 int 或 float64)更高的精度(可以看作有 256 位或更多位的精度)。灵活的隐式转换。

Pyroyster的博客 1199

《GO语言圣经》学习初感与建议

前言 今天刚看了《GO语言圣经》的前二十页,感触颇深,深感此书之精髓,令人叹服,决定从今日起,记录下啃书的收获与感悟,与君共勉!!! 在记录中,我会有选择的进行分享,对那些自我感觉比较关键的细细解读,一些不是太重要的我就简单略过了,以此节省大家的时间。有兴趣的小伙伴可以边看书边看我的博客,有什么想法跟我交流交流,一起进步一起成长,效果想必是极好的。 学习建议 首先说一下,我自学GO...

weixin_42940826的博客 6936

go语言圣经中文版pdf_我的 Go 语言学习之路

原创: Go中文网 Go语言中文网 个人情况简介徐新华(polaris),Go 中文网站长。目前在北京一家创业公司担任 CTO。2011 年春,北京大学硕士毕业,先后在开心网、奇虎 360 工作。本人一直从事服务端相关工作,有着丰富的经验,对前端也有所掌握,Android 开发也了解些。虽然目前管理方面的事情较多,但一直保持着技术学习。擅长服务端技术和架构。我与 Go 语言2012 年 3 月,G...

weixin_39890629的博客 1415
上一篇: 【Go语言圣经2.6】
下一篇: 【Go语言圣经3.6】
Pyroyster
博客等级 码龄7年 206粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值