精华内容
参与话题
问答
  • Go语言核心编程_李文塔.pdf
  • 本书重点介绍Go语言的实践和并发编程范式,力求让读者不但清楚并发的基本语法和原理,还学会怎么去使用。本书对Go语言规范中的命名类型、非命名类型,底层类型,动态类型等概念进行阐述,让*发者对Go的类型系统有...
  • Go语言核心编程.pdf.zip

    2019-06-28 10:54:08
    Go语言核心编程》是一本系统介绍Go 语言编程的书籍。首先介绍Go 语言的基础知识,使读者对Go 语言有一个整体的认知。接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍...
  • 接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍每个语言特性怎么使用,在章节的最后还对重要语言特性的底层实现原理做了介绍。接着介绍反射这个高级语言特征。
  • Go语言核心编程》一书正式上市

    千次阅读 2018-10-09 15:05:01
    市面上几乎所有的图书我都会购来阅读,但是总是感觉缺少一本讲述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。

    展开全文
  • 尚硅谷 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语言核心编程》采用真实案例,源码级深度讲授,全面具体可落地,从理论到实践,一步一步将Go核心编程技术、编程思想、底层实现融会贯通。通过学习本教程,可掌握Go语言编程思想和底层机制,具备真正...
  • 韩顺平讲解Go编程文档,主要是针对GO编程基础以及小案例进行讲解,最重要的是讲解了常见的算法
  • 学习的视频参考b站上尚硅谷韩顺平老师的Go语言核心编程。 1.1 Golang的学习方向 Go语言,可以简单地写成GolangGolang学习方向: 区块链研发工程师 Go服务器端/游戏软件工程师 Golang分布式/云计算软件...

    学习的视频参考b站上尚硅谷韩顺平老师的Go语言核心编程。


    1.1 Golang的学习方向

    Go语言,可以简单地写成Golang。

    • Golang学习方向:

      • 区块链研发工程师

      • Go服务器端/游戏软件工程师

      • Golang分布式/云计算软件工程师

    1.2 Golang的应用邻域

    • 区块链应用

    区块链技术,也被称之为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明、让每个人均可参与数据库记录

    • 后端服务器应用

      • 美团后台流量支撑程序
        支撑主站后台流量(排序、推荐、搜索等),提供负载均衡,cache,容错,按条件分流,统计运行指标(qps,latency)等功能。

      • 仙侠道

    • 云计算/云服务后台应用

      • 盛大云CDN(内容分发网络)
        应用范围:CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统以及其他一些小工具等。

      • 京东消息推送云服务/京东分布式文件系统
        应用范围:后台所有服务全部用go实现。
        golang的计算能力很强。

    展开全文
  • 下载地址:百度网盘

     

    下载地址:百度网盘

    展开全文
  • go语言核心编程

    2019-07-24 13:55:42
    Go语言核心编程
  • Go语言核心编程视频

    2018-08-28 15:47:09
    尚硅谷 Go语言核心编程课程 全套高清视频 希望能帮到大家
  • Go语言核心编程(一)

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

    万次阅读 多人点赞 2014-04-14 19:24:19
    我为什么放弃Go语言?有好几次,当我想起来的时候,总是会问自己:这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言...
  • Go语言高级编程 Go语言代码贡献者,《Go语言高级编程》和《WebAsse...
  • Go高级编程.pdf

    2018-06-29 10:49:03
    Go语言学习手册,有助于学习Go语言,提升Go语言的开发水平
  • Go logo Google的编程语言 Go

    千次阅读 2016-12-15 11:46:11
    Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,,稍后Ian Lance...
  • go语言核心详解

    千次阅读 2018-08-10 20:52:35
    1、锁 2、反射 3、并发编程 数据 1、数组 值传递 2、切片 引用传递 使用append添加数据 3、map 引用传递 4、指针 引用传递 var声明变量 自动推到定义局部变量...
  • 尚硅谷的Go语言核心编程课程,讲的挺细致的,可以看看,多学点技术;如果链接过期了,请留言或者私信。
  • 断断续续写了一年多的Go专栏:《改善Go语言编程质量的50个有效实践》今天终于正式上线了!- https://www.imooc.com/read/87慕课专栏:《改善Go语言编程质量的...
  • 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的...
  • 韩顺平又一力作 开发必备 简单快速上手go语言 go大有可为
  • Go语言编程pdf

    2018-02-28 09:52:00
    下载地址:网盘下载内容简介...本书作者背景极强,许式伟为原金山WPS首席架构师、曾是盛大创新院研究员,目前是国内Go语言实践圈子公认的Go语言专家。参与本书写作的几位作者都是实际用Go语言开发的项目的开发人员,...
  • Go语言编程入门

    万人学习 2016-05-02 23:20:00
    主要介绍Go语言相关的介绍和基础语法,学会开发环境的搭建和使用Go语言简单的编程。本视频教程适合Go语言初学者。
  • 文章目录2.1 Go语言的特点2.2 Go语言开发工具(Mac版本)2.3 Golang执行流程分析2.4 Go程序开发注意事项2.5 Go语言的转义字符2.6 Golang中的注释形式2.7 规范的代码风格2.8 Golang标准库API文档 2.1 Go语言的特点 Go...
  • Go语言并发编程总结

    万次阅读 2015-03-16 17:56:39
    Golang :不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是 goroutine中的 channel ....... 他在go并发编程中充当着 类型安全的管道作用。
  • 书中从如何获取和安装Go语言环境,以及如何建立和运行Go程序开始,逐步介绍了Go语言的语法、特性以及一些标准库,内置数据类型、语句和控制结构,然后讲解了如何在Go语言中进行面向对象编程Go语言的并发特性,如何...
  • Go语言发展历史、核心、特性及学习路线 目录 知名编程语言发展简史 Go语言主要发展过程 Go语言设计初衷 Go语言的优势 Go语言核心特性 Go语言能开发什么? 采用Go语言的国内外企业 Go语言学生路线 一、 Go语言的...
  • Go语言核心特性简介

    2020-04-25 01:03:22
    Go语言在并发编程方面比绝大多数语言要简介不少。不同于传统的多线程或多进程,Go语言的并发执行单元是一种称为goroutine的协程。协程又称微线程,比线程更轻量、开销更小、性能更高。并在语言级别提供了关...

空空如也

1 2 3 4 5 ... 20
收藏数 32,409
精华内容 12,963
关键字:

go语言核心编程