注:本文是《Go语言核心编程》(李文塔/著)个人读书笔记 编译环境 编译go源代码 Go1.5起Go的编译器完全使用Go重写,要源码安装Go需要有Go的编译环境,需要下载 1.4 版本使用C语言编写的 Go编译器源码,通过 Linux自带的gcc先编译出 一个 Go 环境,然后拿这个Go环境编译新版本的Go环境 。 重要的环境变量 $GOROOT $GOROOT 是 Go 的安装根目录 。 $GOPATH 是 Go 语言编程的工作目录(workspace)如果没有设置 GOPATH 环境变量,则 Linux 下系统默认是 $HOME/go。 第三包管理 vendor Go1.5引入了vendor机制,手动设置环境变量GO15VENDOREXPERIMENT= 1,编译器才能启用vendor,从 Go 1.6 起,默认开启vendor目录查找
Go 语言循环语句 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。 以下为大多编程语言循环程序的流程图: Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执行语句块 循环嵌套 在 for 循环中嵌套一个或多个 for 循环 for循环 语法 Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。 和 C 语言的 for 一样: for init; condition; post { } 和 C 的 whil
因为数组的长度是固定的,所以在Go语言中很少直接使用数组。 Go语言数组的声明 数组的声明语法如下: var 数组变量名 [元素数量]Type 语法说明如下所示: 数组变量名:数组声明及使用时的变量名。 "Go语言中文标准库文档地址:Doc.Golang.Ltd" for k, v := range binge{ fmt.Println(k, v) } Go语言中允许使用多维数组,因为数组属于值类型 // 游戏逻辑存储 var DSQ_qi = []int{ // 1-8 Golang语言情怀 ID:wwwGolangLtd www.Golang.Ltd 游戏服务器架构丨分布式技术丨大数据丨Go语言学习
概念 函数式编程VS函数指针 函数是一等公民:参数、变量、返回值都可以是函数 高阶函数 函数->闭包
引言上篇我们了解了Go语言的《函数类型》,本篇主要了解接口类型。主要如下:主要内容一个Go语言的接口由一个方法的集合代表。 至于Go语言的自身定义的一个特殊的接口类型----空类型 interface{},前面也提到过,就是不包含任何方法声明的接口。并且,Go语言中所有数据类型都是它的实现。2. 值表示法Go语言的接口类型没有相应的值表示法,因为接口是规范而不是实现。 使用 Go语言学习2-基本词法 中讲的类型断言表达式验证,编写代码如下:_, ok := interface{}(SortableStrings{}). 本篇就聊到这里,下篇继续未完的Go语言数据类型…
Go Micro框架概况 截止到本文发布时,Go-Micro在github上的star数达到了10.8k,也已经累计发布了v1、v2、v3这三个大版本,目前前两个已经停止维护。 4.Config动态配置 Config定义为动态配置和密码,可类比为配置中心,或者K8s中的ConfigMap与Secret。这个模块的功能更多的是对配置能力的抽象。 7.Registry注册 服务注册这部分包括两块: 服务提供方把服务信息注册到中心节点 服务调用方从中心节点获取服务提供方的信息进行调用 这服务注册与发现的工作,K8s等这类Paas平台已经封装得很完善了 8.Runtime运行时 云时代以容器为核心构建服务,进程的声明周期就可以通过Pod快捷管理。官方对Runtime的描述,更像是CICD+K8s调度服务的综合描述。 我个人对编程语言框架有一个认知:不应过度屏蔽通用中间件的细节,如Redis、Kafka、MySQL等,往往直接在中间件查询问题,比通过框架查询问题更为高效。
8月头条:AI代码助手进一步推动Python发展 上个月,Python在TIOBE指数中达到了编程语言有史以来的最高排名。 需要注意的是,TIOBE指数并不代表最佳编程语言,也不代表用代码行数最多的语言。 该指数可以用来检查你的编程技能是否仍然符合时代需求,或者在开始构建新的软件系统时,帮助你做出采用何种编程语言的战略决策。 根据上图,go语言相对7月份,排名下降了1位。rust语言排名不变。 其他编程语言 以下是完整的前50名编程语言列表。此概览为非官方发布,可能存在遗漏的语言。 接下来的50种编程语言 以下列表列出了排名第51至第100位的编程语言。 除了使用“<语言> programming”外,还应尝试“programming with <语言>”、“<语言> development”和“<语言> coding”等其他查询方式。 2.
通常情况下语言入门前会讲一堆背景和特性,目的是为了能让学习者对该语言有一个大概的认识,但这里我想直接进入细节,不是因为任性,而是因为常量是编程语言最基本的组成元素,这与语言背景无关。 当然可以,要知道GO语言是最懂程序员的哟 :) const PI = 3.1415926535897932 const EluerE = 2.718281828459045 const value = GO是怎么区分常量/变量是对内还是对外的呢? ---- 【编后话】: 开始接触GO,感觉它就是一个大杂烩,里面即有C语言的影子,也有Java语言的影子,也有JavaScript脚本的影子,同时还有Pascal语言的痕迹,但使用使用着感觉这符合人的正常思维 借用知乎用户的话讲:GO语言是一门看似简单实际并不简单,貌似外表丑陋实则另有考究的语言。 ----
Go编程语言提供称为数组的数据结构,其可存储相同类型的元素的一个固定大小的连续集合。数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合。 声明数组 要声明在Go语言数组,程序员指定元素的类型以及如下的数组所需元件的数目: var variable_name [SIZE] variable_type 这就是所谓的一维数组。 = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109 数组是很重要的在Go语言中,应该需要了解更多的细节。 有下列关系到数组几个重要的概念Go程序员是应该清楚的: 概念 描述 多维数组 Go支持多维数组。
Go语言中数组是固定长度的,不能动态扩容,在编译期就会确定大小,声明方式如下: var buffer [255]int buffer := [255]int{0} 切片是对数组的抽象,因为数组的长度是不可变的 ,在某些场景下使用起来就不是很方便,所以Go语言提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素。 这道题本质是考察对切片本质的理解,Go语言中只有值传递,所以我们以传递切片为例子: func main() { param1 := make([]int, 100) param2 := make( 在Go语言,切片拷贝有三种方式: 使用=操作符拷贝切片,这种就是浅拷贝 使用[:]下标的方式复制切片,这种也是浅拷贝 使用Go语言的内置函数copy()进行切片拷贝,这种就是深拷贝, 04. Go语言提供了range关键字用于for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素,有两种使用方式: for k,v := range _ { }
Go语言起源 以下早期语言对Go语言的设计产生了重要影响: C Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”。 Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。 Rob Pike尝试将CSP引入实际的编程语言: Squeak(老鼠间交流的语言)管道静态创建 进版的Newsqueak语言 提供了类似C语言语句和表达式的语法和类似Pascal语言的推导语法 带垃圾回收的纯函数式语言 Alef -> Limbo http://talks.golang.org/2012/concurrency.slide#9 APL iota Scheme 词法作用域与嵌套函数 Go 中的创新设计: 切片 为动态数组提供了有效的随机存取的性能 链表的底层共享机制 defer语句 参考文献 Go语言圣经(简体中文版)
Go 语言Map(集合) Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
摘自:Go语言圣经(简体中文版) 2.3.2 指针 一个变量对应一个保存了变量对应类型值的内存空间。 var x, y int fmt.Println(&x == &x, &x == &y, &x == nil) // true false false 在Go语言中,返回函数中局部变量的地址也是安全的 例如下面这个例子就是通过指针来更新变量的值,然后返回更新后的值,可用在一个表达式中(译注:这是对C语言中++v操作的模拟,这里只是为了说明指针的用法,incr函数模拟的做法并不推荐): func incr 指针特别有价值的地方在于我们可以不用名字而访问一个变量,但是这是一把双刃剑:要找到一个变量的所有访问者并不容易,我们必须知道变量全部的别名(译注:这是Go语言的垃圾回收器所做的工作)。 $ go build gopl.io/ch2/echo4 $ ./echo4 a bc def a bc def $ ./echo4 -s / a bc def a/bc/def $ .
有三个地方变量可以在Go编程语言声明如下: 内部函数或这就是所谓的局部变量块 所有函数的外面的变量称为全局变量 在这被称为形式参数函数的参数的定义 让我们来解释一下什么是局部和全局变量和形式参数。
类型转换是一种可变从一种数据类型转换成另一种数据类型。例如,如果要存储一个long值转成一个简单的整数,那么可以强制类型转换long为int。可以从一种类型使用转换运算符将原类型值转换为另一种类型值,如下: type_name(expression) 例子 请看下面的例子中,产生浮点数运算执行一个整型变量除以另一个数的转换。 package main import "fmt" func main() { var sum int = 17 var count int = 5 var mean float
Go 语言函数 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数字,则返回数组中包含的函数个数。 ---- 函数定义 Go 语言函数定义格式如下: func function_name( [parameter list] ) [return_types] { 函数体 } 函数定义解析: func:函数由 num1 } else { result = num2 } return result } 以上实例在 main() 函数中调用 max()函数,执行结果为: 最大值是 : 200 函数返回多个值 Go 默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
Go 语言中 range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。 for i, c := range "go" { fmt.Println(i, c) } } 以上实例运行输出结果为: sum: 9 index: 1 a -> apple b
Go注释 //单行注释 /* */多行注释 Go的内置关键字 default select defer go goto fallthrough range package(包) import( func(方法) map(map类型) switch case if else for continue break const(定义常量) chan(通道,用于多个服务器之间的通道,用于并发) Go 基本类型 bool:布尔型 1字节,取值:true,false, 不可以用数字代表 int/uint:整型 根据运行平台可能是32或64bit int8/uint8:8位整型 1字节,取值:-128~ 127 byte:字节型 int16/uint16:16位整型 2字节,取值:-32768~32767 int32/uint32:32位整型 4字节 int64/uint64:64位整型 8字节 float32/float64:浮点型 4/8字节 精确到7/15位小数 complex64/complex128:复数 8/16字节 足够保存指针的32位或64位整数型:uintptr 其它值类型
1.配置gopath和goroot goroot是go的安装目录,gopath是go语言的第三方库目录,需要添加环境变量GOPATH、GOROOT(安装时默认添加 ) src目录源码,pkg编译中间文件,bin运行程序 可以通过go env查看配置(同npm config list一样) 2.命令行 go get下载三方库(相当于git clone+go install下载依赖库,下载路径:网站域名github+作者+项目) go install 安装(相当于go build输出目录不同) go build编译成可执行文件 3.go语言变量定义方向不同 type 定义 var变量 var a sting 定义一个字符
不要过度使用any类型 在Go语言中,具有零个方法的接口类型称为空接口(interface {}). 从Go1.18版本开始,出现了一个新的关键字 any, 它是 interface{} 的别名。 此外,在编译时没有保护措施,没法阻止调用者使用任何数据类型(例如int)调用这些方法: s := store.Store{} s.Set("foo", 42) 采用any类型,失去了Go作为静态类型语言的一些好处