速读Go语言圣经

【Go语言圣经】从零开始学Go----1.入门篇 《Go语言圣经》读书笔记,完整知识点整理,从零开始学Golang 阅读详情

The Go Programming Language

中文版教程:https://studygolang.com/book/42?fr=sidebar
前面1-5章都可以在Go语言教程|菜鸟教程,runoob.com/go/go-tutorial.html找到对应的教程。

第一章 入门

本章介绍了Go语言的基础组件。提供了足够的信息和示例程序,可以帮你快速入门。同时作者指出,学习Go语言,请不要按照自己熟悉的语音的套路写新语言程序。

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

第二章 程序结构

变量声明

一般语法如下,下面这种一般声明的是全局变量。如果初始化表达式被省略,那么将用零值初始化该变量。多维数组也是一样的。

var 变量名字 类型 = 表达式

简短变量声明

在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以”名字:=表达式“形式声明变量,变量的类型根据表达式来自动推导。

t := 0.0

第三章 基础数据类型

Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。本章介绍基础类型,包括:数字、字符串和布尔型。复合数据类型–数组和结构体–是通过组合简单类型,来表达更加复杂的数据结构。引用类型包括指针、切片、字典、函数、通道,虽然数据种类很多,但它们都是对程序中一个变量或状态的间接引用。这意味着对任一引用类型数据的修改都会影响所有该引用的拷贝。

第四章 复合数据类型

数组和结构体是聚合类型;它们的值由许多元素或成员字段的值组成。数组是由同构的元素组成–每个数组元素都是完全相同的类型–结构体则是由易购的元素组成的。数组和结构体都是有固定内存大小的数据结构。相比之下,slice和map则是动态的数据结构,它们将根据需要动态增长。

  • slice是由数组实现的,map是由hashtable实现的。个人认为,slice很像stl里面的vector,map很像stl里面的hashmap。

第五章 函数

本章的运行示例是一个网络蜘蛛,也就是web搜索引擎中负责抓取网页部分的组件,它们根据抓取网页中的链接继续抓取链接指向的页面。一个网络蜘蛛的例子给我们足够的机会去探索递归函数、匿名函数、错误处理和函数其它很多特性。(to be continue…)

第六章 方法

在本章中,OOP编程的第一方面,我们会想你展示如何有效地定义和使用方法。我们会覆盖到OOP编程的两个关键点,封装和组合。
在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

package geometry

import "math"

type Point struct{ X, Y float }

// traditional function
func Distance(p, q Point) float64 {
	return math.Hypot(q.X-p.X, q.Y-p.Y)
}

// same thing, but as a method of the Point type
func (p Point) Distance(q Point) float64 {
	return math.Hypot(q.X-p.X, q.Y-p.Y)
}

上面的代码里那个附加的参数p,叫做方法的接收器(receiver),早期的面向对象语言留下的遗产将调用一个方法称为“向一个对象发送消息”。

在Go语言中,我们并不会像其它语言那样用this或者self作为接收器;我们可以任意的选择接收器的名字。由于接收器的名字经常会被使用到,所以保持其在方法间传递时的一致性和简短性是不错的主意。这里的建议是可以使用其类型的第一个字母。

在方法调用过程中,接收器参数一般会在方法名之前出现。这和方法声明时一样的,都是接收器参数在方法名之前。下面是例子:

p := Point{1, 2}
q := Point{4, 6}
fmt.Println(Distance(p, q))	//"5", function call
fmt.Println(p.Distance(q))	//"5", method call

可以看到,上面的两个函数调用都是Distance,但是却没有发生冲突。第一个Distance的调用实际上用的是包级别的函数geometry.Distance,而第二个则是使用刚刚声明的Point,调用的是Point类下声明的Point.Distance方法。

通过嵌入结构体来扩展类型

在类型中内嵌的匿名字段也可能是一个命名类型的指针,这种情况下字段和方法会被间接地引入到当前的类型中。添加这一层间接关系让我们可以共享通用的结构并动态地改变对象之间的关系。

一个struct类型也可能会有多个匿名字段。我们将ColoredPoint定义为下米娜这样:

type ColoredPoint struct {
	Point
	color.RGBA
}

然后这种类型的值便会有用Point和RGBA类型的所有方法,以及直接定义在ColoredPoint中的方法。当编译器解析一个选择器到方法时,比如p.ScaleBy,它会首先去找直接定义在这个类型里的ScaleBy方法,然后找呗ColoredPoint的内嵌字段们引入的方法,然后去找Point和RGBA的内嵌字段引入的方法,然后一直递归向下找。如果选择器有二义性的话编译器会报错,比如你在同一级里有两个同名的方法。

第七章 接口

接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具适应能力。

很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必须的方法就足够了。这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义;当我们使用的类型来自于不收我们控制的包时这种设计格外有用。

类型开关

Go语言实现多态,利用一个接口值可以持有各种具体类型值的能力并且将这个接口认为是这些类型的union(联合)。类型断言用来动态地区别这些类型并且对每一种情况都不一样。在这个方式中,重点在于具体的类型满足这个接口,而不是在于接口的方法(如果它确实有一些的话),并且没有任何的信息隐藏。我们将以这种方式使用的接口描述为discriminated unions(可辨识联合)。

func sqlQuote(x interface{}) string {
	switch x := x.(type) {
		case nil:
			return "NULL"
		case int, uint:
			return fmt.Sprintf("%d", x) 	// x has type interface{} here.
		case bool:
			if x {
				return "TRUE"
			}
			return "FALSE"
		case string:
			return sqlQuoteString(x) 		// (not shown)
		default:
			panic(fmt.Sprintf("unexpected type %T: %v", x, x))
	}
}

尽管sqlQuote接受一个任意类型的参数,但是这个函数只会在它的参数匹配类型开关中一个case时运行到结束;其它情况的它会panic出"unexpected type"消息。虽然x的类型是interface{},但是我们把它认为是一个int、uint、bool、string和nil值的discriminated union(可识别联合)

第八章 Goroutines和Channels

Go语言中的并发程序可以用两种手段来实现。本章讲解goroutine和channel,其支持”顺序通信进程“(communicating sequential processes)。CSP是一种现代的并发编程模型,在这种编程模型中值会在不同的运行实例(goroutine)中传递,尽管大多数情况下仍然是被限制在单一实例中。
尽管Go对并发的支持是众多强力特性之一,但跟踪调试并发程序还是很困难,在线性程序中形成的直觉往往还会使我们误入歧途。如果这是读者第一次接触并发,推荐稍微多花一些时间这两个章节中的样例。
(to be continue…)

第九章 基于共享变量的并发

在本章中,我们会细致地了解并发机制。尤其是在多goroutine之间的共享变量,并发问题的分析手段,以及解决这些问题的而基本模式。最后我们会解释goroutine和操作系统线程之间的技术上的一些区别。
(to be continue…)

第十章 包和工具

Go语言的编译速度主要得益于三个语言特性。

  • 第一点,所有导入的包必须在每个文件的开头显式声明,这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。
  • 第二点,禁止包的环状依赖,因为没有环状依赖,包的依赖关系形成一个有向的无环图,每个包可以被独立编译,而且很可能被并发编译。
  • 第三代,编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。因此,在编译一个包的时候,编译器只需要读取每个直接导入包的目标文件,而不需要遍历所有依赖的文件。

第十一章 测试

Go语言的测试技术是相对低级的。它依赖一个go test测试命令和一组按照约定方式编写的测 试函数,测试命令可以运行这些测试函数。编写相对轻量级的纯测试代码是有效的,而且它很容易延伸到基准测试和示例文档。
在实践中,编写测试代码和编写程序本身并没有多大区别。我们编写的每一个函数也是针对每个具体的任务。我们必须小心处理边界条件,思考合适的数据结构,推断合适的输入应该 产生什么样的结果输出。编程测试代码和编写普通的Go代码过程是类似的;它并不需要学习 新的符号、规则和工具。

第十二章 反射

Go语音提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内 在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让 我们将类型本身作为第一类的值类型处理。

有时候我们需要编写一个函数能够处理一类并不满足普通公共接口的类型的值,也可能是因 为它们并没有确定的表示方式,或者是在我们设计该函数的时候还这些类型可能还不存在,各种情况都有可能。
没有一种方法来检查未知类型的表示方式,我们被卡住了。这就是我们为何需要发射的原因。

第十三章 底层编程

主要讲使用unsafe包来摆脱Go语言规则带来的限制,讲述如何创建C语言函数库的绑定,以及如何进行系统调用。
就是和C联合编程。

单窗算法的地表温度反演:谷歌地球引擎GEE代码 该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。 阅读详情

相关推荐

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4764

Go语言圣经

第一章入门

kwdecsdn的博客 2754

音频降采样系数

如果需要把8K, 16K, 32K, 48K采样率的音频数据降为4K的音频数据, 最简单的方法根据降频倍数来取点, 但是线性度不好. 另一种线性度好一点的方法是: 取适当个数的点数, 各点乘以各自点的系数, 然后相加取平均值. 降频倍数与系数的关系如下: 2倍:     {0.3, 0.4, 0.3} 4倍:    {0.15, 0.2, 0.3, 0.2, 0.15} 8倍:   {0

joans123的专栏 4645

Go语言圣经总结

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

yelvens的博客 2058

ComfyUI 提示Allocation on device 显存占满的解决方法及秋叶整合包的优化方法

最近在玩ComfyUI的时候,发现一个让人崩溃的问题——VRAM一直占满,最终报错: 简单来说,就是显卡显存溢出了,导致程序无法继续运行。尤其是一些大模型或者复杂工作流,很容易让显存飙升到极限。那怎么办?直接在启动命令后加上 ,例如: 这个参数的作用是啥? 默认情况下,ComfyUI会尽量让模型一直留在显存里,即使有些部分暂时用不到,导致显存迟早被填满。而 可以强制让ComfyUI把数据卸载到常规内存,减少显存占用。如果你的显存真的不够用,还可以再加 参数: 这个参数的意思就是开启低显存模式,进一步优化

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 685

Go语言圣经(中文版)

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

dazheng 1万+

深度学习笔记——Transformer

本文详细介绍面试过程中可能遇到的Transformer知识点。

haopinglianlian的博客 1703

GO语言从入门到达人--GO语言圣经--入门

1.Go的一些基本规范 GO是编译型语言。Go的工具链讲程序的源文件转变为机器相关的原生二进制 GO原生地支持Unicode,支持任何国家的语言。 GO语言其实由三部分组成 : 1.声明自己属于哪个包 package main 2.导入其他包 import (“fmt”) 3.程序本身 func main(){ 代码块 } 一般import后面是组成函数 – func 函数 const 常量 var 变量 type 类型 GO语言不适用分号进行结尾。 GO语言的" { "是不可以单独一行的,必须与f

weixin_44324366的博客 670

GDB交叉编译与问题解决:从零到精通的深度指南

完成后,GDB会安装到/usr/local/gdb-aarch64/bin,可以用aarch64-linux-gnu-gdb --version检查。:得有支持目标架构的交叉编译工具链,比如gcc-arm-none-eabi(用于ARM裸机)或aarch64-linux-gnu-gcc(用于ARM Linux)。:在配置工具链时,运行aarch64-linux-gnu-gcc --version检查版本,确保工具链没问题。这种场景下用GDB调试,就像在荒野求生,但别慌,GDB依然是你的好伙伴。

大模型大数据攻城狮的专栏 1万+

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

别再到处找PDF了!这个宝藏IT电子书网站,Python/Java/Go等上万本免费下

本文推荐了一个宝藏IT电子书网站,提供Python、Java、Go等上万本免费电子书下载,帮助程序员高效获取学习资源。文章详细介绍了如何精准搜索、评估书籍质量,并提供了按技术栈分类的精品书单和完整学习策略,助力开发者从下载到精通。

weixin_29213655的博客 497

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

我的Golang语言学习日记(简单快速易懂,保姆级包教会!)

随着云的不断发展,Golang这门语言也越来越重要,很多人都开启了学习Golang,本文就介绍了Golang的基础内容。一、Golang是什么?Golang,也被称为Go,是由Google公司于2009年发布的一种开源编程语言。其重要性体现在多个方面:首先,Golang具有简洁的语法和高效的性能,这极大地提高了开发者的编程效率,使得编写高质量、可维护的代码变得更加容易。其次,Golang内置了强大的并发编程支持,如goroutine和channel,这使得开发高性能的并发应用变得简单且安全。

2302_80017985的博客 1101

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《Go语言圣经》第一章 - 读书笔记

《Go语言圣经》第一章 命令行参数 练习1.1 练习1.2 练习1.3 查找重复的行 练习1.4 GIF 动画 练习1.5 练习1.6 获取URL 练习1.7 练习1.8 练习1.9 并发获取多个URL 练习1.10 练习1.11 Web服务 练习1.12 本章要点 控制流 命名类型 指针 方法和接口 包(packages)注释

Pola_的博客 2239

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Go】Go 语言圣经章节目录

Go(又称为Golang)是一种开源的编程语言,由Google开发,于2009年首次公开发布。它旨在提供简洁、高效、可靠的软件开发解决方案。Golang是一种静态强类型、编译型语言,Golang具有很强的表达能力,得益于其并发机制,用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。

春天熊的技术博客 1143

Go语言圣经 - 第7章 接口 - 7.5 接口值

第7章 接口 接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力 Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用 7.5 接口值 接口值由两个部分组成,一个具体类型和这个类型的值。它们被称为接口的动态类型

weixin_51487151的博客 609

《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学习圣经:0基础精通GO开发与高并发架构(1)

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

架构师尼恩 4753

【Go语言圣经】1.入门

Go语言是一门现代化的语言,从其方便的工具链、简洁的语法规则可得一瞥。

shao_zi_kang的博客 272

【Go语言圣经】从零开始学Go----2.程序结构

《Go语言圣经》读书笔记,完整知识点整理,从零开始学Golang

2301_79819426的博客 1136

《Go语言圣经》反射概述

Go 语言的reflect包是实现反射机制的关键工具,它允许程序在运行时检查变量的类型、值和结构,突破了静态类型语言的限制,为动态编程提供了可能。和,分别用于处理类型信息和值信息。

woshihlf的博客 785

【go语言圣经1.6】

并发执行实例指的是程序中可以同时运行的多个任务或执行单元。这些任务可以独立执行,共享程序的资源,并在某种程度上并行或交替运行。goroutine是 Go 语言中用于实现并发执行的核心概念。它是一种轻量级的执行单元,由 Go 运行时调度管理,相比于传统的线程开销更低。每个 goroutine 都可以看作是一个并发执行实例,它们共同构成了程序的并发部分。每个通过go关键字启动的函数调用就是一个 goroutine,也就是一个并发执行实例。

Pyroyster的博客 871

【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
上一篇: Go海拾遗
下一篇: 第五章 函数--《The Go Programming Language》
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值