Go语言编程(旧读书笔记)

Go语言编程

目录

[隐藏]

[编辑]前言

  1. 协程? go run(‘test‘)
  2. Go强制了{ }的编写风格: if expression {
  3. 错误处理:
    1. defer?相当于finally?注意这里的作用域,defer之前似乎没有用{ }把整个(try)块括起来?

      1. defer相当于说推迟语句的执行,其内部实现会自动管理嵌套作用域的问题?
    2. Go允许返回多个值(像Python里的tuple返回)
  4. Go用组合,不用继承、虚函数、虚函数重载
  5. Go里的变量声明是先变量名字,后类型名字(Pascal风格,但没有:)?
  6. Go的接口是duck typing吗?
    1. Go里,2个接口只要拥有相同的方法列表(名字、签名、顺序??),那么就是等同的
  7. ?Go里避免太多的{ }嵌套可能是一种策略——这使它显得更像一门脚本语言,给程序员写代码带来某种“轻快”的感觉。。。

[编辑]初识Go语言

  1. Plan 9上的Limbo语言被认为是Go的前身?
  2. 支持自动GC?——那不就和Java/C#的性能差不多了么
  3. 更丰富的内置类型:
    1. Slice
    2. map
  4. 多返回值
    1. func getName() (firstName, lastName, nickName string){

      //由于这里返回值也给了名字,因此可以赋值然后空return!(Python里似乎还不能够这么灵活,靠)
    2. fn, ln, nn := getName()
      模式匹配(destructuring):_,ln,_ := getName()
  5. 错误处理:defer、panic、recover
  6. 匿名函数和闭包
    1. f := func(x,y int) int { return x+y }
  7. 类型:类似于C里的struct(估计这里借用了Objective-C的一些做法。。。)
    1. type Bird struct { ... }
    2. func (b *Bird) Fly() { ... } //这一句的写法我怎么有点看不明白呢?见鬼
  8. 并发编程
    1. resultChan := make(chan, int, 2)
    2. go sum(.../*参数略*/, resultChan)
    3. func sum(..., resultChan chan int) {
      ... resultChan <- sum
    4. sum1, sum2 := <-resultChan, <-resultChan //Channel对象只有一个符号操作:<- ,放左边代表取出,右边表示放进?
  9. 反射:靠,这边的语法太丑陋了,妈的
  10. Cgo
  11. 第1个Go程序:
    1. package main
    2. import "fmt"
    3. func main() {
      fmt.Println("Hello, world!")
  12. go run hello.go //直接运行;
    1. go build hello.go && ./hello //编译运行;即可以解释执行,也可以编译运行(这个跟Rust倒是一样的)

[编辑]顺序编程

  1. var v3 [10]int //变态的数组声明语法~
  2. var v7 map[string] int //string->int的映射
  3. i := 10 //自动类型推导?
  4. i,j = j,i
  5. 数值类型:int uint int32 int64 float32 float64 complex64 complex128
  6. const
  7. true false iota(每个const的开头从0开始,每次出现自动增1?用于定义枚举,但Go并不支持enum关键字)
  8. string byte/rune error
  9. uintptr
  10. 不同类型的数不能直接比较,也就是说,Go不做自动类型提升
  11. 字符串遍历:for i := 0; i < len(str); i++ { ... str[i] }
  12. Unicode字符遍历:
    1. for i, ch := range str { ... }
  13. 数组是一个值类型!
    1. 切片:var mySlice []int = myArray[:5]

      mySlice2 := make([]int, 5)
      可动态增减元素:len(mySlice) cap(mySlice) append copy ...
  14. map
    1. delete(myMap, "key") //靠,这里的操作都是C语言风格的,不支持C++/Java/C#里的.成员函数访问操作?
  15. 流程控制:
    1. if else
    2. switch case
    3. for
    4. goto
  16. 函数
    1. 成员函数的写法太怪异了:func (file *File) Read(b []byte) (n int, err Error) //注意,没有其他语言里的this、self等关键字!
  17. 闭包
  18. 错误处理
    1. p48 return nil, &PathError("stat", name, err) //这里&的写法是怎么回事?以引用方式传递对象吗
    2. defer func() { ... } ()
    3. func panic(interface())
    4. func recover() interface()

[编辑]OOP

  1. 值语义(默认?)和引用语义(&)

    1. ?Go使用*符号,那么它到底是不是C/C++里的指针?(估计不是,但看着有点诡异)
  2. 初始化
    1. r1 := new(Rect)
    2. r2 := &Rect()
  3. 组合就是继承:type Derived struct{
    Base //还可以写成*Base,这样的话,。。。——相当于C++里的虚基类?
    ... //*log.Logger:可直接注入其他类的方法?但logger类显然无法访问当前类的数据成员(!!)
  4. 可见性:大写为public,小写是private
  5. (非侵入式的)接口
    1. 这里的语法似乎有点类似于Objective-C。。。注意声明type IFile interface { ... }时,里面的Read、Write不需要带(f *File)(this引用)
    2. 接口查询:略
    3. 类型查询:vt := v.(type)
    4. 接口组合
    5. Any类型:interface()

[编辑]并发编程

  1. 主main不等待goroutine直接退出会导致线程强制结束?
  2. channel
    1. select(这是学习了Erlang吧?)
    2. 超时机制:创建一个额外的channel
      1. timeout := make(chan bool, 1)
      2. go func() { time.Sleep(1e9) timeout <- true }()
      3. select {
        ... case <-timeout: //已经超时
    3. 利用channel传递实行管道?
    4. 单向chan:声明的时候加上<-
    5. 关闭:close(ch)
  3. 同步
    1. sync.Mutex sync.RWMutex
    2. sync.Once

[编辑]网络编程

  1. net.Dial?这个方法名太。。。了
  2. net/http
  3. net/rpc
    1. Gob
  4. JSON

[编辑]安全编程

[编辑]工程管理

  1. 远程import:神经病!
  2. GOPATH
  3. Android支持???——必须在adb shell下运行吧

[编辑]开发工具

[编辑]进阶话题

  1. 反射

    1. Type, Value
  2. 语言交互
    1. Cgo:import "C"
  3. 链接符号:由下列信息构成(注意Go里无重载)
    1. Pakcage
    2. ClassType
    3. Method(恩?链接符号允许/、*、. ?)
  4. goroutine机制
    1. libtask?
  5. 接口机制

[编辑]附录A

  1. 常用包:fmt io bufio strconv os sync flag encoding/json http

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 22:33:54

Go语言编程(旧读书笔记)的相关文章

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

《Windows核心编程》读书笔记 上

[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLas

《C专家编程》读书笔记

<C专家编程>读书笔记 C语言的设计哲学: 一切工作程序员自己负责. 语言中的所有特性都不需要隐式的运行时支持. 程序员所做的都是对的. 程序员应该知道自己在干什么,并保证自己的所作所为是正确的. --第1章-- C: 穿越时空的迷雾 小即是美.事物发展都有个过程,由简入繁,不能一开始就想得太复杂,Multics, IBM的OS/360都是因此而失败. C语言的许多特性是为了方便编译器设计者而建立的.----唉,怎么这个样子 C语言的基本数据类型直接与底层硬件相对应.----确实如此 regi

Unix编程艺术读书笔记(一)

 Unix编程艺术读书笔记(一)这本书是一位面试官告诉我的,很感谢他的指点,关于面试的详细过程,我想以后再写,当然我也意识到自己的不足,一方面是面试的技巧,还有一方面就是学习的方法.阅读这本书很享受,加上之前的积累,一些疑惑,还有一些基础的不足,在这本书里找到了归宿. 下面,一起来享受这本书的精华吧 Unix诞生与1969年,那时候我们还在闹文革吧,可一个可以改变21世纪甚至更远的未来的操作系统问世,至少现在的Linux是基于Unix的设计哲学.Unix是唯一一个在不同种类的计算机,众多厂商

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

JavaScript DOM编程艺术 读书笔记

3 DOM DOM分别指document,object和model. DOM中包含的节点主要分为三种:元素节点.文本节点和属性节点.DOM的原子是元素节点,标签的名字就是元素的名字,元素可以包含其他的元素.没有被包含在其他元素里的唯一元素是<html>元素,它是树节点的根元素:在XHTML文档里,文本节点总是被包含在元素节点的内部.但并非所有的元素节点都包含有文本节点:属性节点用来对元素做出更具体地描述. 有3种DOM方法可获取元素节点,分别是通过元素ID.通过标签名字和通过类名字来获取. 1

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX