go语言核心编程_go语言核心编程 pdf - CSDN
精华内容
参与话题
  • Go语言核心编程_李文塔.pdf
  • 接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍每个语言特性怎么使用,在章节的最后还对重要语言特性的底层实现原理做了介绍。接着介绍反射这个高级语言特征。
  • 本书主要分三个方面介绍Go语言Go语言精华——并发和小而美的类型系统;Go语言缺陷;Go语言的哲学。本书重点介绍Go语言的实践和并发编程范式,力求让读者不但清楚并发的基本语法和原理,还学会怎么去使用。本书对Go...
  • Go语言核心编程.pdf.zip

    2020-07-27 23:32:28
    Go语言核心编程》是一本系统介绍Go 语言编程的书籍。首先介绍Go 语言的基础知识,使读者对Go 语言有一个整体的认知。接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍...
  • Go语言核心编程(一)

    2020-09-19 16:09:28
    Golang核心编程: 区块链(去中心化,让人人都可以参与数据库的记录)研发工程师 Go服务器端(美团)/游戏软件工程师 Golang分布式/云计算软件工程师(京东) Go语言,我们可以简单的写成Golanguage,简写为Golang...

    Golang学习方向

    Golang核心编程:

    • 区块链(去中心化,让人人都可以参与数据库的记录)研发工程师
    • Go服务器端(美团)/游戏软件工程师
    • Golang分布式/云计算软件工程师(京东)

    Go语言,我们可以简单的写成Golanguage,简写为Golang。

    Golang的应用领域

    • 区块链应用开发
    • 后端服务器应用
    • 云计算/云服务后台应用

    Go语言概述

    程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。
    2009年11月10日,Google将Go语言以开放源代码的方式向全球发布;
    2015年8月19日,Go1.5版发布,本次更新中移除了“最后残余的C代码”。
    Go语言的特点:
    Go语言保证了既能达到静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。

    1. 从C语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等,也保留了和C语言一样的编译运行方式及弱化的指针;
    2. 引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在;
    3. 垃圾回收机制,内存自动回收,不需开发人员管理;
    4. 天然并发:
      1) 从语言层面支持并发,实现简单;
      2) goroutine,轻量级线程,可实现大并发处理,高效利用多核;
      3) 基于CPS并发模型实现。
    5. 吸收了管道通信机制,形成Go语言特有的管道channel
      通过管道channel,可以实现不同的goroute之间的相互通信
    6. 函数返回多个值
    7. 新的创新:比如切片、延时执行defer等

    Go环境配置

    下载SDK和去官网下载Go的安装程序,直接傻瓜安装即可。
    之后进入到解压后的SDK的压缩包,SDK解压后会看到一个go文件夹,进入到该文件夹下的bin目录,并进入控制台命令(windows),若输入go version可看到go版本的输出信息,即证明go安装成功,但注意为了以后的使用方便,还需进一步地配置Go的环境变量,这里只针对windows进行配置说明:

    GOROOT E:\Go\
    GOPATH D:\goproject
    path E:\Go\bin %GOROOT%\bin

    根据自己Go和SDK的安装目录按上面进行配置即可,之后重新打开windows的控制台窗口,这次无需进入go的bin目录,输入go version也能看到安装的go的版本了。大功告成!

    windows下开发步骤:

    1. 安装windows版本 VScode
    2. 将Go代码编写到扩展名为hello.go的文件中
      [说明:源码在工作目录src/go_code下,如d:/goproject/src/go_code]
    3. 通过go build命令对该go文件进行编译,生成.exe文件
    4. 在dos命令行下执行.exe文件就可以看到运行效果
    5. 注意:通过go run命令可以直接运行hello.go程序[类似执行一个脚本文件的格式]

    注意:如果对go程序文件进行编译运行时出现以下错误的话:

    import cycle not allowed 
    package main
    imports fmt
    imports errors
    import int
    

    首先代码可能是没问题的,这时唯一的解决办法就是…重装go了…

    Golang执行流程分析:
    如果是对源码编译后,再执行,Go的执行流程如下图:
    在这里插入图片描述
    如果我们是对源码直接执行go run 源码,Go的执行流程如下图:

    在这里插入图片描述

    Golang执行流程分析:

    说明:两种执行流程的方式区别

    1. 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行;
    2. 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go开发环境,否则无法执行;

    什么是编译?
    1) 有了go源文件,通过编译器将其编译成机器可以识别的二进制文件;
    2)在该源文件目录下,通过go build对hello.go文件进行编译。可以指定生成的可执行文件名,在windows下必须是.exe后缀;

    go build -o myhello.exe hello.go
    

    3)如果程序没有错误,没有任何提示,会在当前目录下出现一个可执行文件;
    4)如果程序有错误,编译时,会在错误的那行报错。

    Go程序开发注意事项(重点)

    1)Go源文件以"go"为扩展名
    2)Go应用程序的执行入口是main()方法
    3)Go语言严格区分大小写
    4)Go方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性
    5)Go编译器是一行一行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
    6)go语言定义的变量或者import的包如果没有使用到,代码不能编译通过;
    7)大括号都是成对出现的,缺一不可。

    Golang常用的转义字符
    1. \t:一个制表位,实现对齐的功能
      2)\n:换行符
      3)\:一个
      4)":一个"
    2. \r:一个回车 fmt.Println(“hello world!\rzahngsan”)

    Golang官方网站:https://golang.org
    Golang API官方文档:https://golang.org/pkg
    Golang 中文网 在线标准库文档:https://studygolang.com/pkgdoc

    Go——变量

    变量相当于内存中的一个数据存储空间的表示,你可以把变量看作是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。
    变量使用的基本步骤:
    1)声明变量
    2)赋值
    3)使用
    在这里插入图片描述

    变量中的使用事项:

    • 变量表示内存中的一个存储区域;
    • 该区域有自己的名称(变量名)和类型(数据类型);
    • Golang变量使用的三种方式:
      1)指定变量类型,声明后若不赋值,使用默认值
      2)根据值自行判定变量类型
      3)省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误
    • 多变量声明:在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法
    var num1,num2,num3 int
    
    num1,name,num2 := 10,"zhangsan",22
    
    • 该区域的数据值可以在同一类型范围内不断变化
    • 变量在同一个作用域内不能重名
    • 变量=变量名+值+数据类型
    • Golang的变量如果没有赋初值,编译器会使用默认值,比如int默认值0,string默认值为空串

    变量的数据类型:
    每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
    在这里插入图片描述
    整型的类型:

    类型 有无符号 占用存储空间 表数范围 备注
    int8 1字节 -128~127
    int16 2字节 -2^15~ 2^15-1
    int32 4字节 -2^31 ~ 2^31-1
    int64 8字节 -2^43 ~ 2^43-1
    类型 有无符号 占用存储空间 表数范围 备注
    uint8 1字节 0~255
    uint16 2字节 0~2^16-1
    uint32 4字节 0~2^32-1
    uint64 8字节 0~2^64-1
    类型 有无符号 占用存储空间 表数范围 备注
    int 32位系统4个字节、64位系统8个字节 -2^31 ~ 2^31-1、-2 ^63 ~ 2^63-1
    uint 32位系统4个字节、64位系统8个字节 0~2^32-1 、0~ 2^64-1
    rune 与int32一样 - 2^31 ~2^31-1 等价int32,表示一个Unicode码
    byte 与uint8等价 0~255 当要存储字符时选用byte

    整型的使用细节:
    1)Golang各整数类型分:有符号和无符号,int uint的大小和系统有关;
    2)Golang的整型默认声明为int型
    3)如何在程序查看某个变量的字节大小和数据类型;

    unsafe.Sizeof(n1)
    

    4)Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型;
    5)bit:计算机中的最小存储单位,byte:计算机中基本存储单元。

    浮点型的分类:

    类型 占用存储空间 表数范围
    单精度float32 4字节 -3.403E38~3.403E38
    双精度float64 8字节 -1.798E308~1.798E308

    其中,浮点数=符号位+指数位+尾数位,浮点数都是有符号的。

    浮点型使用细节:

    • Golang浮点类型有固定的范围和字段长度,不受具体OS的影响

    • Golang的浮点型默认声明float64类型

    • 浮点型常量有两种表示形式:
      十进制数形式、科学计数法形式

    • 通常情况下,应该使用float64,因为它比float32更精确

    字符类型:
    字符串就是一串固定长度的字符连接起来的字符序列,Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的

    func main(){
    	var c1 byte = 'a'
    	var c2 byte = '0'
    	var c3 int = '北'
    	fmt.Println("c1=",c1,"c2=",c2)
    	fmt.Println("c1=%c c2=%c",c1,c2)
    	fmt.Println("c3=%c",c3)
    

    如果我们保存的字符在ASCII表,比如[0-1,a-z,A-Z],直接可以保存到byte;
    如果我们保存的字符对应码值大于255,这时可以考虑使用uint保存;
    如果我们需要按照字符的方式输出,这时需要格式化输出,fmt.Printf(“c1=%c”,c1)

    字符串注意事项和使用细节:

    • Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码

    • 字符串一旦赋值了,字符串就不能修改了,在Go中字符串是不可变的

    • 字符串的两种表示形式:
      (1)双引号,会识别转义字符
      (2)反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果

    • 字符串拼接方式

    • 当一行字符串太长时,需要使用到多行字符串

    布尔类型:

    • 布尔类型也叫bool类型,bool类型数据只允许取值true和false
    • bool类型占1个字节
    • boolean类型适于逻辑运算,一般用于程序流程控制

    基本数据类型的转换:
    Golang和java/c不同,Go在不同类型的变量之间赋值时需要显式转换,也就是说Golang中数据类型不能自动转换

    func main(){
    	var i int32 = 100
    	var n1 float32 = float32(i)
    

    注:被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!而且,在转换中,比如将int64转成int8,编译不会报错,只是转换的结果是按溢出处理的,和我们希望的结果不一样

    基本数据类型和string的转换:
    方式一:fmt.Sprintf("%参数",表达式)
    方式二:使用strconv包的函数(string类型转基本数据类型也可用)
    具体细节使用内容可以查看手册:
    https://studygolang.com/pkgdoc

    展开全文
  • 尚硅谷 2018 Go语言核心编程课程
  • Go语言核心编程(二)

    2020-09-24 16:02:56
    指针 基本介绍: 基本数据类型,变量存的就是值,也叫值类型 获取变量的地址,用&,比如:var num int,获取num的地址:&num 指针类型,变量存的是一个地址,这个地址指向的空间存的才是值 ...
    指针

    基本介绍:

    • 基本数据类型,变量存的就是值,也叫值类型
    • 获取变量的地址,用&,比如:var num int,获取num的地址:&num
    • 指针类型,变量存的是一个地址,这个地址指向的空间存的才是值
      比如:var ptr *int=&num
    • 获取指针类型所指向的值,使用:*,比如 var *ptr int,使用 *ptr获取ptr指向的值

    指针细节说明:

    • 值类型,都有对应的指针类型,形式为 *数据类型,比如int的对应的指针就是 *int,float32对应的指针类型就是 *float,依次类推
    • 值类型包括:基本数据类型 int 系列,float系列,bool,string、数组和结构体struct
    值类型和引用类型

    常见的值类型和引用类型:
    1)值类型:基本数据类型int系列,float系列,bool,string、数组和结构体struct
    2)引用类型:指针、slice切片、map、管道chan、interface等都是引用类型

    值类型和引用类型使用特点:
    1)值类型:变量直接存储值,内存通常在栈中分配
    2)引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收

    标识符的命名规范

    标识符概念:
    1)Golang对各种变量、方法等命名时使用的字符序列称为标识符
    2)凡是自己可以起名字的地方都叫标识符

    标识符的命名规则:

    • 由26个英文字母大小写,0-9,_组成
    • 数字不可以开头
    • Golang中严格区分大小写
    • 标识符不能包含空格
    • 下划线“_”本身在Go中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但是它对应的值会被忽略(比如,忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用
    • 不能以系统保留关键字作为标识符,比如break,if等等…

    保留关键字介绍:

    break default func interface select
    case defer go map struct
    chan else goto package switch
    const fallthrough if range type
    continue for import return var

    注:在Go中,如果变量名、函数名、常量名首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用(可以理解为,首字母大写是公开的,首字母小写是私有的),在golang中没有public,private等关键字。

    预定义标识符:
    除了保留关键字外,Go还提供了36个预定的标识符,其包括基础数据类型和系统内嵌函数

    append bool byte cap close complex
    complex64 complex128 uint16 copy false float32
    float64 imag int int8 int16 uint32
    int32 int64 iota len make new
    nil panic uint64 print println real
    recover string true uint uint8 uintprt
    运算符

    运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

    • 算术运算符
    • 赋值运算符
    • 比较运算符
    • 逻辑运算符
    • 位运算符
    • 其它运算符

    注:Golang的++和–只能写在变量的后面不能写在变量的前面,即:只有a++,a–没有++a,–a;而且++和–只能独立使用。

    逻辑运算符:
    注意事项和细节说明:
    1)&&也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
    2)| | 也叫短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true

    位运算符
    运算符 描述
    & 按位与运算符“&”是双目运算符,其功能是参与运算的两数各对应的二进位相与。运算规则是:同时为1,结果为1,否则为0
    | 按位或运算符,其功能是参与运算的两数各对应的二进位相或。运算规则是:有一个为1,结果为1,否则为0
    ^ 按位异或运算符,其功能是参与运算的两数各对应的二进位相异或,运算规则是:当二进位不同时,结果为1,否则为0
    << 左移运算符,其功能是把"<<"左边的运算数的各二进位全部左移若干位,高位丢弃,低位补0,左移n位就是乘以2的n次方
    >> 右移运算符,其功能是把">>"左边的运算数的各二进位全部右移若干位,右移n位就是除以2的n次方

    注意:Go语言不支持传统的三元运算符,要用if-else分支来实现。

    键盘输入语句

    在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
    步骤:
    1)导入fmt包;
    2)调用fmt包的fmt.Scanln()或者fmt.Scanf()
    Scanln()是程序会停止在这里,等待用户输入,并回车;
    Scanf()是可以按指定的格式输入。

    var name string
    var age byte
    var salary float32
    var ispass bool
    fmt.Println("请输入姓名:")
    fmt.Scanln(&name)
    ...
    fmt.Scanf("%s %d %f %t",&name,&age,&salary,&ispass)
    
    原码、反码、补码

    对于有符号的而言:

    • 二进制的最高位是符号位:0表示正数,1表示负数;
    • 正数的原码、反码和补码都一样;
    • 负数的反码=它的原码符号位不变,其他位取反;
    • 负数的补码=它的反码+1;
    • 0的反码,补码都是0;
    • 在计算机运算的时候,都是以补码的方式运算的。
    跳转控制语句goto
    1. Go语言的goto语句可以无条件地转移到程序中指定的行;
    2. goto语句通常与条件语句配合使用,可用来实现条件转移,跳出循环体等功能;
    3. 在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。
    fun main(){
    	fmt.Println("ok1")
    	fmt.Println("ok2")
    	goto label
    	fmt.Println("ok3")
    	fmt.Println("ok4")
    	label:
    	fmt.Println("ok5")
    }
    

    函数注意事项:

    • 在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用;
    • 函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用!
    • 为了简化数据类型定义,Go支持自定义数据类型;
    • 支持对函数返回值命名
    • Go支持可变参数
    func cal(n1 int,n2 int)(sum int,sub int){
    		sum = n1 + n2
    		sub = n1 - n2
    		return
    }
    
    func sum(args...int)sum int{
    }
    func sum(n1 int,args...int)sum int{
    }
    
    init函数

    每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用。
    1)如果一个文件同时包含全局变量定义,init函数和main函数,则执行的流程是变量定义——>init函数——>main函数
    2)init函数最主要的作用是,就是完成一些初始化工作。

    匿名函数

    Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用。

    • 匿名函数使用方式1
      在定义匿名函数时就是使用
    func main(){
    	res := func(n1 int,n2 int) int{
    		return n1 + n2
    }(10,20)
    
    • 匿名函数使用方式2
      将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
    func main(){
    	res := func(n1 int,n2 int) int{
    		return n1 + n2
    }
    a := res(10,20)
    

    全局匿名函数:
    如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可以在程序中有效。

    闭包

    基本介绍:闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)
    闭包最佳实践:
    请编写一个程序,具体要求如下:
    1)编写一个函数makeSuffix(suffix string)可以接收一个文件后缀名(比如.jpg)并返回一个闭包;
    2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg),则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名;
    3)要求使用闭包的方式完成;
    4)strings.HasSuffix.
    在这里插入图片描述
    代码说明:
    1)返回的函数和makeSuffix(suffix string)的suffix变量和返回的函数组合成一个闭包,因为返回的函数引用到suffix这个变量;
    2)闭包的好处:如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg,而闭包因为可以保留上次引用的某个值,所以传入一次就可以反复使用。
    在这里插入图片描述

    函数中-defer

    为什么需要defer?
    在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等)为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer(延时机制)
    在这里插入图片描述
    程序输出的结果顺序是:
    1)res=30
    2)ok2 n2=20
    3)ok1 n1=10
    当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈),当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行。

    defer细节说明:
    1)当go执行到一个defer时,不会立即执行defer后的语句,而是将defer后的语句压入到一个栈中,然后继续执行函数下一语句;
    2)当函数执行完毕后,在从defer栈中,依次从栈顶中取出语句执行;
    3)在defer将语句放入到栈时,也会将相关的值拷贝同时入栈。
    注:defer之后相关变量仍然可以继续使用。(defer file.close() defer connect.close())

    函数参数的传递方式

    两种传递方式:
    1)值传递
    2)引用传递
    其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝。一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。

    值类型:基本数据类型int系列、float系列、bool,string、数组和结构体struct
    引用类型:指针、slice切片、map、管道chan、interface等都是引用类型

    变量作用域

    说明:
    1)函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部;
    2)函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效;
    3)如果变量是在一个代码块,比如for /if 中,那么这个变量的作用域就在该代码块。

    字符串中常用的函数

    说明:字符串在我们程序开发中,使用的是非常多的“:
    1)统计字符串的长度,按字节len(str)
    2)字符串遍历,同时处理有中文的问题r:=[]rune(str)
    3)字符串转整数:n,err:=strconv.Atoi(“12”)
    4)整数转字符串:str=strconv.Itoa(12345)
    5)字符串转[]byte:var bytes=[]byte{“hello go”}
    6)[]byte转字符串:str=string([]byte{97,98,99})
    7)10进制转2,8,16进制:str=strconv.FormatInt(123,2)
    8)查找子串是否在指定的字符串中:strings.Contains(“seafood”,“foo”)
    9)统计一个字符串有几个指定的子串:strings.Count(“ceheese”,“e”)
    10)不区分大小写的字符串比较(==是区分字母大小写的):fmt.Println(strings.EqualFold(“abc”,“Abc”))
    11)返回子串在字符串第一次出现的index值,如果没有返回-1:strings.Index(“NIL_abc”,“abc”)
    12)返回子串在字符串最后一次出现的index,如没有返回-1:strings.LastIndex[“go golang”,“go”]
    13)将指定的子串替换成另外一个子串:strings.Replace(“go go hello”,“go”,“go语言”,n)n可以指定你希望替换几个,如果n=1表示全部替换
    14)按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组
    15)将字符串的字母进行大小写的转换:strings.ToLower(“Go”)
    16)将字符串左右两边的空格去掉:strings.TrimSpace(" to huhj jioj “)
    17)将字符串左右两边指定的字符去掉:strings.Trim(” ! hello!","!")
    18)将字符串左边指定的字符去掉:strings.TrimLeft("! hello !","!")
    19)将字符串右边指定的字符q去掉:strings.TrimRight("! hello !","!")
    20)判断字符串是否以指定的字符串开头:strings.HasPrefix(“ftp://192.168.10.1”,“ftp”)
    21)判断字符串是否以指定的字符串结束:strings.HasSuffix(“NIL_abc.jpg”,“abc”)

    … …
    查看官方文档:https://studygolang.com/pkgdoc

    Go错误处理机制

    基本说明:
    1)Go语言追求简洁优雅,所以,Go语言不支持传统的try…catch…finally这种处理;
    2)Go中引入的处理方式为:defer,panic,recover
    3)这几个异常的使用场景可以简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理
    在这里插入图片描述

    数组和切片

    四种初始化数组的方式:

    1. var num [3]int = [3]int{1,2,3}
    2. var num = [3]int{1,2,3}
    3. var num = […]int{1,2,3}
    4. var num = […]int{1:99,0:100,2:9}

    数组的遍历:
    1.常规遍历
    2.for-range遍历
    for index,value := range array{
    }

    切片——golang中一种特有的数据类型

    为什么需要切片?
    比如我们需要一个数组用于保存学生的成绩,但是学生的个数是不确定的,就可以使用切片来解决。
    基本介绍:
    1)切片——slice
    2)切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制
    3)切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样
    4)切片的长度是可以变化的,因此切片是一个可以动态变化的数组
    5)切片定义的基本语法:
    var 变量名 []类型
    比如:var a []int

    type slice struct{
    ptr *[2]int
    len int
    cap int
    }
    切片的使用:
    1.定义一个切片,然后让切片去引用一个已经创建好的数组;
    2.通过make来创建切片。
    基本语法:
    var 切片名[] type = make([],len,[cap])
    参数说明:type就是数据类型 len:大小 cap:指定切片容量(即最大可以存放多少个元素),可选
    3)定义一个切片,直接就指定具体数组,使用原理类似make的方式:var num []int=[]int{1,2,3}

    方式1和方式2的区别:
    方式1是直接引用数组,这个数组是事先存在的,程序员是可见的;
    方式2是通过make来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员是看不见的。
    在这里插入图片描述
    注:切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用。

    string和slice

    1)string底层是一个byte数组,因此string也可以进行切片处理
    2)string和切片在内存的形式
    3)string是不可变的 ,也就是说不能通过str[0]='z’方式来修改字符串
    4)如果需要修改字符串,可以先将string——>[]byte修改重写转成string

    排序的介绍

    排序的分类:
    1)内部排序:
    指将需要处理的所有数据都加载到内部存储器中进行排序:
    包括交换式排序法、选择式排序法、插入式排序法
    2)外部排序法:
    数据量过大,无法全部加载到内存中,需要借助外部存储进行:
    包括合并排序法和直接合并排序法

    交换式排序法

    交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
    交换式排序法又可分为两种:
    1)冒泡排序法
    2)快速排序法

    查找

    在golang中,我们常用的查找有两种:
    1)顺序查找;
    2)二分查找(该数组是有序的);

    二维数组的使用

    使用方式:先声明/定义再赋值
    1)语法:var 数组名[大小][大小]类型
    2)比如:var arr [2][3]int,再赋值
    3)二维数组在内存的存在形式(重点)

    使用方式2:直接初始化
    1)声明:var 数组名[大小][大小]类型=[大小][大小]类型{{初值…},{初值…}}
    2)赋值(有默认值,比如int 类型的就是0)
    3)说明:二维数组在声明/定义时也对应有四种写法[和一维数组类似]

    二维数组的遍历:
    1)双层for循环完成遍历
    2)for-range方式完成遍历

    map

    map介绍:
    map是key-value数据结构,又称为字段或者关联数组,类似其它编程语言的集合,在编程中是经常用到。
    基本语法:
    var map变量名 map[keytype]valuetype
    key可以是什么类型?
    golang中的map的key可以是很多种类型,比如bool,数字,string,指针,channel,还可以是只包含前面几个类型的接口、结构体、数组
    通常为int,string

    注意:slice,map还有function不可以,因为这几个没法用 == 来判断

    map声明的简单举例:
    var a map[string]string
    var a map[string]int
    var a map[int]string
    var a map[string]map[string]string
    注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

    func main(){
    	var a map[string]string
    	a = make(map[string]string,10)
    	a["no1"] = "宋江"
    	fmt.Println(a)
    }
    

    或者在声明的时候直接赋值:

    func main(){
    	var a map[string]string = map[string]string(
    	"NO1":"宋江",
    	)
    	a["No2"] = "武松"
    }
    

    map遍历:
    说明:map的遍历使用for-range的结构遍历
    map切片:
    切片的数据类型如果是map,则我们称为slice of map,map切片,这样使用则map个数就可以动态变化了。

    func main(){
    	var monsters []map[string]string
    	monsters = make([]map[string]string,2)
    	if monsters[0] == nil{
    		monsters[0] = make(map[string]string,2)
    		monsters[0]["name"] = "monster1"
    		monsters[0]["age"] = "500"
    	}
    }
    

    下面用到切片的append函数,可以动态的增加monster

    newMonster := map[string]string(
    	"name":"monster2",
    	"age":1000,
    	)
    newMonster = append(monsters,newMonster)
    

    map排序:
    1)golang中没有一个专门的方法针对map的key进行排序
    2)golang中的map默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样
    3)golang中map的排序,是先将key进行排序,然后根据key值遍历输出即可

    如果按照map的key的顺序进行排序输出:
    1.先将map的key放到切片中
    2.对切片排序
    3.遍历切片,然后按照key来输出map

    var keys []int
    for k,_ :range map1{
    	keys = append(keys,k)
    }
    #排序
    sort.Intskeys(keys)
    for _,k :range keys{
    	fmt.Println(k,map1[k])
    }
    
    

    map使用细节:
    1)map是引用类型,遵守引用类型传递的机制,在一个函数接收map,修改后,会直接修改原来的map
    2)map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)
    3)map的value也经常使用struct类型,更适合管理复杂的数据,比如value为Student结构体
    在这里插入图片描述

    展开全文
  • Go语言核心编程》一书正式上市

    千次阅读 2018-11-05 18:58:21
    市面上几乎所有的图书我都会购来阅读,但是总是感觉缺少一本讲述Go语言的三大核心:类型系统、接口、并发的图书,这么多年过去了,一直没有人写,最后我决定动手写一本这个主题的图书,书名叫《Go语言核心编程》。...

    书籍概况

    Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用;在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱,不仅告诉读者陷阱是什么,正确使用方式是什么,同时也给出出现这种问题的根本原因,使读者后续能够避免犯同样的错误。本书最后从哲学角度论述下Go语言的编程思想,相信Go语言爱好者一定可以从书中找到自己感兴趣内容。 感兴趣的点击图片链接书籍的详情。

    这本书特点

    1. 不是前篇一律的堆积罗列语法。
      本书精炼的使用一个章节介绍了Go语言的基础支持:包括关键字、数据类型和控制结构。不是一个个语法点的堆砌,而是将源程序看成一个整体,从源代码的整体构造上讲解语法,事半功倍。
    2. 既讲到怎么使用,也讲到内部原理。
      Go有一些明显区别其他语言的地方,比如函数的多值返回、并发等,在介绍这些专题的章节最后都会有一个深入分析原理的章节。介绍下Go语言的内部实现机制和原理。
    3. 编程哲学方面的思考。
      最后在本章的最后分析下为什么Go语言更适合编程,更适合建模解决现实问题,基于几个哲学方面的思考,让读者更深层次上理解Go的设计思想。

    图书连接

    点击图片查看详情
    go.jpg

    写作背景

    2007 年,Go 语言诞生于谷歌公司,2009 年开源,2012 年推出1.0 版本,曾两次获得TIOBE年度语言(2009 年和2016 年)。2012 年起,全球大量的开源项目开始使用Go 语言进行开发,目前Go 语言已经成为云计算领域事实上的标准语言,特别是在容器领域,诞生了一大批优秀的开源软件,如Docker、Kubernetes 等。2017 年区块链技术在国内大热,区块链两个大的技术平台以太坊(Ethereum)和超级账本(Hyperledger)子项目Fabric 都是基于Go 语言构建的。Go 语言的应用领域逐步扩大,目前在区块链、云计算、中间件和服务器编程领域显现出明显的优势。Go 语言最先在云计算公司盛行,随后大量的互联网初创企业将Go 语言作为后台主要开发语言。目前,无论互联网公司里的独角兽,还是BAT(百度、阿里巴巴、腾讯),都已将Go语言作为其技术栈的重要组成部分。市场对于Go 语言编程人才的需求量也在持续上升。

    目前,Go 语言编程类图书有如下几个类别。

    基础全面型

    七牛团队写作和翻译的几本书(《Go 语言编程》《Go 程序设计语言》等),系统地介绍了Go 开发的基础知识,为Go 语言在国内的推广做出了很大的贡献。

    源码深入型

    雨痕的《Go 语言学习笔记》,上半部分是对 Go 语言基础知识的总结,下半部分对源码进行了分析,是学习Go 语言内部原理非常好的参考书。

    专业领域型

    专注于介绍某个应用领域,比如谢孟军的《Go Web 编程》,这类图书主要是介绍使用Go
    语言在某个领域进行开发的相关知识。

    市面上Go 语言的图书这么多了,为什么又要写一本,本书和市面上的图书有什么区别呢?这也是我写这本书之前就认真思考过的问题。我发现市面上缺少介绍Go 语言核心特性和使用陷阱的书。Go 语言核心特性包括类型系统、接口、并发,这三部分是Go 语言最精华、最优美、最重要的语言特性。于是我就围绕这三个主题写了本书,书名就叫《Go 语言核心编程》。以类型系统为例,Go 语言中的类型涉及简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型及类型字面量等诸多概念,这些在先前的书籍里没有系统地介绍过,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会使用;在并发编程中给出了5 个并发编程范式并系统地介绍了context 标准库,这也是本书特有的。

    内容简介

    本书共9 章,围绕如下主题展开:基础知识(第1 章)、语言核心(第2 章~第7 章)、工程管理(第8 章)和编程哲学(第9 章)。

    基础知识

    第1 章介绍Go 语言编程的基础知识。基础知识部分力求从系统性的角度讲述Go 语言简洁的语法知识,试图帮助读者了解Go 语言源程序基本结构,这是本书不同于其他书籍的地方。本章先对Go 的源程序进行整体介绍,然后从词法分析的角度介绍Go 语言的各个token,接着介绍Go 语言的基础语法:变量和常量、数据类型及控制结构,让读者学习Go 语言的语法知识时可以“既见树木,又见森林”。

    语言核心

    本书的第2~7 章讲解Go 语言核心知识,这部分是本书最核心、最重要的部分,主要围绕如下4 个主题展开。

    1.类型系统

    本书用3 章的篇幅来讲解Go 语言的类型系统,分别是第2 章函数、第3 章类型系统和第4章接口。类型系统是Go 语言的灵魂,Go 语言小而美的类型系统是其区别于其他语言的显著特征。函数在Go 语言中是“一等公民”,非侵入式的接口设计也很有特点。类型系统是本书的一条主要线索,几乎贯穿本书的所有章节,在反射章节里会对Go 的类型系统做一个总结。掌握类型系统是写好Go 程序的关键。

    2.并发编程

    第5 章介绍Go 并发编程,并发编程的原生支持是Go 语言显著的语言特征。“不要通过共享内存来通信,而是通过通信来共享内存”,本章首先讲解语言层面对并发的支持,接着讲解context 标准库的知识,最后讲解常用的并发范式和Go 并发模型。

    3.反射

    第6 章介绍Go 语言反射的相关知识。反射是Go 语言的高级特性,反射是把“双刃剑”,用好了会有强大的威力,但由于其复杂性且易产生运行时panic,因此反射又表现出脆弱性。Go 语言没有提供泛型支持,所以在开发框架和大型系统中反射是必须面对的一个技术点,市面上的图书对这部分的介绍不多,本书分类总结了Go 的反射API,尽可能梳理出条理清晰的API结构;同时以类型系统和接口底层实现为基础来介绍反射;最后介绍著名的Web 框架martini中使用的依赖注入库inject。

    4.陷阱和习惯用法

    第7 章介绍Go 语言陷阱和一些习惯用法,包括Go 语言使用过程中容易出错和初学者容易困惑的知识点。Go 语言虽然设计简洁,但在某些方面还是有瑕疵的,比如 defer 陷阱、短变量的声明range 临时变量共享等。同时Go 又有其鲜明的书写格式和习惯用法,本章的最后会介绍这些内容。

    工程管理

    Go 语言是一门面向工程的语言,而不是学术界的产物,第8 章介绍Go 语言工程管理方面的知识,主要介绍Go 的编程环境、命名空间和包管理的相关内容。

    编程哲学

    第9 章讨论编程哲学,这部分内容不是介绍编程细节知识,读者可以把它当作散文来读。先对Go 语言编程哲学做一个总结:少即是多,世界是并行的,组合优于继承,面向接口编程,等等,试图从哲学的角度来阐述这些设计思想的先进性。最后介绍Go 语言的里程碑事件及未来的发展方向。

    相关约定

    本书使用Go 代表Go 语言的简写,使用go 表示Go 语言的并发关键字,使用goroutine 代表Go 语言中的并发执行体。通道和chan 都代表Go 语言的通信管道。切片和slice 都表示Go语言内置的可变数组。本书使用实例或者类型实例表示具体类型的变量,而没有使用传统语言对象的概念。标准库和标准包会混用,都是指Go 语言自带的标准库。复制和拷贝具有相同的语义,都表示将数据复制一份并拷贝到另一处内存空间。本书是基于Go 1.10.2 写作的,新版本的变动请读者以官方文档为准。截至本书出版时,Go 1.11 发布,官方推出了新的包管理工具go mod,go mode 兼容dep,dep 仍可放心使用,go mod 是新增的功能需要一段时间成熟。

    总结

    本书绝大大部分内容是笔者六年来学习和实践Go语言过程中的总结和感悟,成书过程中也参阅了部分网上和官方资料,由于能力有限,错误或者疏忽之处难免发生,欢迎读者指正,以便我们及时修订,我的邮箱是email.tata@qq.com。

    展开全文
  • Go语言核心编程视频

    2020-07-17 17:51:00
    尚硅谷 Go语言核心编程课程 全套高清视频 希望能帮到大家
  • 下载地址:百度网盘

     

    下载地址:百度网盘

    展开全文
  • go语言就业指南

    万人学习 2018-10-22 21:38:09
    授人予鱼不如授人予渔,本课程不但包含go语言从业者所的技能,而且还包含开发人员在开发中的学习技巧。掌握这些技巧和技能可以让你在面试中游刃有余。学习过程中任何问题联系: 4223665
  • Golang全栈工程师入门到实战

    千人学习 2019-02-25 16:28:50
    本套课程针对于编程新手或者从未接触过编程的人群; 从Golang的发展史及基础语法直至Golang实战应用都会涉及到; 为了方便大家掌握Golang全栈开发,本套视频还包括了其他编程技术讲解。
  • go语言文件汇总

    千次阅读 2016-04-15 19:00:45
    归并排序及go语言实现 堆排序算法及go语言实现 Go语言基础学习(一)变量 【Leetcode】:Counting Bits问题 in Go语言 基于go语言的心跳响应 【Leetcode】:Single Number III问题 in Go语言...
  • 关于Golang的介绍

    千次阅读 2019-01-05 17:55:40
    1.Go语言是谷歌2009发布的第二款开源编程语言。 2.Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 3.Google对Go寄予厚望。其设计...
  • Go语言-进阶篇

    千人学习 2018-10-22 21:38:16
    区块链第一语言,Web新贵; 兼具Python的简洁与C++的强大; 用超多好玩的小例子,带你打开通向世界2.0的大门; 风格依旧水煮,依旧不拘一格脑洞大开;
  • Go语言好书推荐

    千次阅读 2019-05-09 23:27:11
    Go核心编程》 《Go并发编程实战》 推荐购买正版 若需要呵呵版,网盘地址: 《Go核心编程》 链接:https://pan.baidu.com/s/1IRFxsFpmk_mjDgtz6AiAqg 提取码:微信关注 小韩说课,发送 gobook1 获取提取码 ...
  • Go Web实战视频教程

    千人学习 2018-12-03 16:33:59
    Go语言开发Web服务器的方法
  • go编程语言为什么这么流行?

    千次阅读 2019-10-17 20:18:41
    go语言编程书籍:深入学习Go语言谷歌正在积极支持这一项目,但golang在互联网上看到了许多其他流行品牌和企业的使用、贡献和成功案例。go承诺提供一种非常简单易学的语法,允许我们构建健壮、可靠、高效的软件。一旦...
  • Go语言编程

    万人学习 2019-06-24 11:39:46
    Go 的前世今生与 Go 语言编程的基础教学,以及七牛云存储应用 Go 的实践分享。
  • 轻量级的Web框架Gin教程

    千人学习 2019-08-28 09:50:29
    Gin 是一个 go 写的 web 框架,封装比较优雅,API友好,源码注释比较明确,具有高性能的优点。 Golang的高并发一大利器就是协程。Gin里可以借助协程实现异步任务。
1 2 3 4 5 ... 20
收藏数 31,300
精华内容 12,520
关键字:

go语言核心编程