zoukankan      html  css  js  c++  java
  • golang 读书笔记

    介绍

    Go语言是一种让代码分享更容易的编程语言。Go语言自带一些工具,让使用别人写的包更容易,并且分享自己写的包更容易。

    Go语言对并发的支持是这门语言最重要的特性之一。goroutine很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。通道(channel)是一种内置的数据结构,可以让用户在不同 的goroutine之间同步发送具有类型的消息。

    术语

    goroutine 是可以与其他goroutine并行执行的函数,同时也会与主程序(程序的入口)并行执行。

    个人理解: 相当于其他语言的多线程

    channel 一种数据结构,可以让goroutine之间进行安全的数据通信。

    可以避免像其他语言里常见的共享内存访问的问题。

    鸭子类型 如果它叫起来像鸭子,那它就可能是只鸭子

    规范

    • 如果接口类型只包含一个方法,那么这个类型的名字以er结尾

    Go语言的类型系统

    1. 类型简单
    2. Go接口对一组行为建模

    空白标识符(_) 用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。
    init函数 每个包可以包含任意多个init函数,所有被编译器发现的init函数都在main函数之前执行。

    文档

    命令行获取

    go doc fmt

    浏览文档

    godoc -http=:6060
    包含所有Go标准库和你的GOPATH下Go源代码的文档

    函数的文档直接写在函数声明之前,使用人类可读的句子编写。如果想给包写一段文字量比较大的文档,可以在工程里包含一个叫作doc.go的文件,使用同样的包名,并把包的介绍使用注释加在包名声明之前。

    数据类型

    引用类型 切片、map、channel(通道)、接口、函数, 当声明上述类型的变量时,创建的变量被称作 Header 值
    数组 固定长度。用于存储一段具有相同的类型的元素的连续块
    如果使用 ... 代替数组长度,则更具初始化时数组元素的数量来确定该数组的长度

    // 声明一个包含5个元素的整型数组
    var array [5]int
    // 用具体值初始化每个元素
    array := [5]int {1, 2, 3, 4, 5}
    // 容量由初始化值的数量决定
    array := [...]int {1, 2, 3, 4, 5}
    // 用具体值初始化索引为1,2 的元素,其余则保持0
    array := [5]int {1: 1, 2: 2}
    

    切片 动态数组,可以按需自动增长和缩小。

    在64位架构机器上, 一个切片需要24字节的内存: 指针字段需要8字节,长度和容量字段分别需要8字节。

    // 创建一个字符串切片,其长度和容量都是5个元素
    slice := make([]string, 5)
    // 长度为3个元素,容量为5个元素 不容许创建容量小雨长度的切片
    slice := make([]int, 3, 5)
    // 创建 nil 整型切片
    var slice []int
    
    

    如果在 [] 运算符中指定了一个值,那么创建的就是数组而不是切片

    //创建有3个元素的整型数组
    array := [3]int {10, 20, 30}
    //创建长度和容量都是3的整型切片
    slice := []int {10, 20, 30}
    
    • 赋值和切片
      创建一个新切片就是把底层数组切出一部分
    //创建一个整型切片,其长度和容量都是5个元素
    slice := []int{1,2,3,4,5}
    //创建一个新切片,其长度为2个元素,容量为4个元素
    newSlice := slice[1:3]
    

    对于底层数组容量是k的切片 slice[i:j] 来说
    长度: j - i
    容量: k - i

    • 切片增长
      append 总是增加新切片的长度,而容量则有可能会改变,容量改变取决于被操作的切片的可用容量

    • 创建切片时的第3个索引
      第三个索引可以用来控制新切片的容量,其目的并不是要增加容量,而是要限制容量

    slice[i:j:k]
    长度 j - i
    容量 k - i

    • 迭代
      range 返回两个值。第一个值是 索引 第二个对应位置元素值的一份副本

    map
    存储一系列无序键值对

    自定义类型

    1. 使用关键字struct创建一个结构类型
    type User struct {
    	ID string 
    }
    
    1. 基于一个已有类型,将其作为新类型的类型说明
    type Duration int64
    // int64类型叫作Duration的基础类型。Go 并不认为 Duration 和 int64 是同一类型。这两个类型是完全不同的有区别的类型。
    

    struct

    struct 有2中方法, 值方法和指针方法

    • 值方法 调用时会使用这个值的一个副本来执行
    • 指针方法 调用时使用这个值的引用来执行

    也可以使用指针来调用值方法,编译器转换后的代码
    (*obj).method()
    也可以使用值来调用引用方法,编译器转换后的代码
    (&ojb).method()

    声明一个方法时使用 值方法 还是 指针方法,取决于想得到一个新值还是想修改原有的值

    接口
    用来定义行为

    channel

    unbuffered := make(chan int)    //无缓冲通道
    buffered := make(chan int, 10)
    
    • 无缓冲的通道 在接收前没有能力保存任何值的通道

    总结

    • Go语言是现代的、快速的、带有一个强大的标准库。
    • Go语言内置对并发的支持。
    • Go语言使用接口作为代码复用的基础模块。
    • 每个代码文件都属于一个包,而包名英国与代码文件所在的文件夹同名
    • Go语言提供了多种声明和初始化变量的方式。如果变量的值没有显式初始化,编译器会将变量初始化为零值。
    • 使用指针可以在函数间活着goroutine间共享数据。
    • 通过启动goroutine和使用通道完成并发和同步
    • Go语言提供了内置函数来支持Go语言内部的数据结构。
    • Go语言中包是组织代码的基本单位
    • 环境变量GOPATH决定了Go源代码在磁盘上被保存、编译和安装的位置。
    • 可以为悲歌工程设置不同的GOPATH,以保持源代码和依赖的隔离。
    • Go工具是在命令行上工作的最好工具
    • 开发人员可以使用go get 来获取别人的包并将其安装到自己的GOPATH指定目录
    • 要为别人创建包很简单,只要吧源代码放到公用代码库,并遵守一些简单的规则就可以了。
    • Go语言在设计时将分享代码作为语言的核心特性和驱动力。
    • 推荐使用依赖管理工具来管理依赖 如 godep, vender, gb
    • 数组结构是切片和map的基石
    • Go语言里切片经常用来处理数据的集合,map用来处理具有简直对结构的数据
    • 内置函数make可以创建切片和map,并指定原始的长度和容量。也可以直接使用切片和map字面量,活着使用字面量的初始值。
    • 切片有容量限制,不过可以使用内置的append函数扩展容量。
    • map的增长没有容量或者任何限制
    • 内置函数len可以用来获取切片或者map的长度
    • 内置函数cap只能用于切片 (cap()函数返回的是数组切片分配的空间大小)
    • 通过组合,可以创建多维组和多维切片。也可以使用切片或者其他map作为map的值。但是切片不能用作map的键
    • 将切片或者map传递给函数成本很小,并且不会复制底层的数组结构。
    • 使用关键字 struct 或者指定已经存在的类型,可以声明用户定义的类型。
    • 方法提供了一种给用户定义的类型增加行为的方式。
    • 设计类型时需要去人类型的本质是原始的,还是非原始的。
    • 接口是声明了一组行为并支持多态的类型。
    • 嵌入类型提供了扩展类型的能力,而无需使用继承。
    • 标识符要么是从包里公开的,要么是在包里未公开的。
  • 相关阅读:
    SQL Server用户和角色
    小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置
    数据库的概念
    域对象
    session
    cookie
    表单
    HttpServletResponse
    JavaWeb核心之Servlet
    Tomcat服务器
  • 原文地址:https://www.cnblogs.com/warrior/p/9453229.html
Copyright © 2011-2022 走看看