***

使用go build编译该程序,注意这里需要指定 -gcflags "-N -l" 关闭编译器优化,否则编译器可能把对sum函数的调用优化掉。

bobo@ubuntu:~/study/go$ gobuild  -gcflags"-N -l"sum.go

***

go fmt命令——格式化代码文件

https://studygolang.com/articles/18538?fr=sidebar

***

通道-chan

发送端关闭通道,而不应该在接收端关闭通道,否则会引起panic

***

通道的特性就是它的自同步和其元素值的原子性。

在 go 语言的并发程序中,通道会成为联系各个Goroutine的纽带。

在需要循环的接收通道中的元素值的场景下,应该优先使用 for 语句来实现:

var ch chan int
if ch != nil{
  for ch != range ch {
    fimt.Printf("Element: %v\n",e)
  }
}

select 语句中,default case 会在收发操作无法配对的情况下被选中并执行。

代码包 time 中的定时器(time.Timer)和 断续器(time.Ticker)都充分利用了缓冲通道的异步特性来传达到期事件。

*** 锁

go 语言中,死锁错误的发生几率极低。其主要原因是有defer 语句的存在。

在 Go 语言中,读写锁有结构体类型 sync.RWMutex 代表。与互斥锁类似,sync.RWMutex类型的零值就已经是立即可用的读写锁了。在此类型的方法集合中包含了两对方法,即:

  func (*RWMutex) Lock

  func (*RWMutex) Unlock

  

  func (*RWMutex) RLock

  func (*RWMutex) RUnlock

前一对方法的名称和签名与互斥锁的那两个方法完全一致。它们分别代表了对写操作的锁定和解锁。以下简称它们为写锁定和写解锁。

而后一对方法则分别表示了对读操作的锁定和解锁,以下简称它们为读锁定和读解锁。

写解锁在进行的时候会试图唤醒所有因欲进行读解锁而被阻塞的Goroutine。而读解锁在进行的时候只会在已无任何读锁定的情况下试图唤醒一个因欲进行写锁定而被阻塞的Goroutine。若对一个未被写锁定的读写锁进行解锁,就会引起一个运行时恐慌,而对一个未被读锁定的读写锁进行读解锁不会发生 panic。

原则上,不应该把通道当作互斥锁或信号灯来使用。

《effective go》

gofmt 格式化 go 源文件

go 文件注释:

------------------------------------------------------------------------------------------------------

/*
regexp 包为正则表达式实现了一个简单的库。
该库接受的正则表达式语法为:
正则表达式:
串联 { '|' 串联 }
串联:
{ 闭包 }
闭包:
条目 [ '*' | '+' | '?' ]
条目:
'^'
'$'
'.'
字符
'[' [ '^' ] 字符遍历 ']'
'(' 正则表达式 ')'
*/
package regexp

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

在程序中,每个可导出(首字母大写) 的名称都应该有文档注释。

------------------------------------------------------------------------------------------------------

命名:

大写首字母,包外可见。

包应当以小写的单个单词来命名,且不应该使用下划线或驼峰记法。 

获取器:若你有个名为 owner (小写,未导出) 的字段,其获取器应当名为 Owner(大写,可导出) 而非 GetOwner。 设置器方法,SetOwner .

Go 中约定使用驼峰记法(匈牙利命名法) MixedCaps 或 mixedCaps 。

以指针或值为接收者的区别在于:值方法可通过指针和值调用,而指针方法只能通过指针来调用。

若该值是可寻址的, 那么该语言就会自动插入取址操作符来对付一般的通过值调用的指针方

法。在我们的例子中,变量 b 是可寻址的,因此我们只需通过 b.Write 来调用它的 Write 方
法,编译器会将它重写为 (&b).Write

用空白标识符声明一个全局变量:

var _ json.Marshaler = (*RawMessage)(nil)
检测json.Marshaler 的实现情况。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

go 杂项笔记的更多相关文章

  1. 杂项-笔记-VS:VS2019笔记

    ylbtech-杂项-笔记-VS:VS2019笔记 1.返回顶部 1. http://www.ddooo.com/softdown/142335.htm 2. 2.返回顶部   3.返回顶部   4. ...

  2. perl 学习杂项笔记

    ### 由于perl 语法属于很自由的那种, 建议出现错误的时候打开 -w 或者使用 -Mdiagnositics 试一下 ### 如何调试 perl程序 http://www.ibm.com/dev ...

  3. UCOS 杂项 笔记

    1.  建立任务和建立数据队列  哪个先建立? 经过试验得知,数据队列和任务的建立先后没有顺序,都可以正常运行. 2.关于主函数的面试问题. 主函数写法有:   int  main()    和voi ...

  4. 一些css杂项笔记

    div[class*="col-"]{ background-color: gold; border: 1px solid #ccc; } //给class开头等于col-的div ...

  5. shell 其他杂项知识点笔记

    // 其他杂项知识点 对于普通用户,Base shell 默认的提示符是美元符号$:对于超级用户(root 用户),Bash Shell 默认的提示符是井号# ------- \#!是一个约定的标记, ...

  6. 杂项-SpringEureka:笔记-1

    ylbtech-杂项-SpringEureka:笔记-1 1.返回顶部 1. THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT ...

  7. 《你必须知道的495个C语言问题》读书笔记之第15-20章:浮点数、风格、杂项

    一.可变参数列表 1. Q:为什么调用printf前必须要包含<stdio.h>? A:为了把printf的正确原型说明引入作用域.例如,如果可变参数的调用比固定参数的调用效率低,编译器就 ...

  8. MySQL高级学习笔记(二):mysql配置文件、mysql的用户与权限管理、mysql的一些杂项配置

    文章目录 mysql配置文件 二进制日志log-bin 错误日志log-error 数据文件 两系统 Myisam存放方式 innodb存放方式 如何配置 mysql的用户与权限管理 MySQL的用户 ...

  9. 《python核心编程》笔记——杂项

    python语句默认会给每一行添加一个换行符,只要在最后加一个逗号就能改变这种行为 若函数里没有return就自动返回None对象 PEP(python增强提案简称)http://python.org ...

随机推荐

  1. socket AcceptAsync方法的使用

    AcceptAsync与Accept很大的不一样 Accept是一个同步 阻塞的已经封装好底层的方法 AcceptAsync是一个异步 非阻塞未封装的底层连接入口,需要手动填入连接代码用于优化sock ...

  2. python学习-dict

    a = ["秦时明月","长沙","女"]bafenshu = ["八分熟","上海"," ...

  3. CCF-CSP题解 201512-3 画图

    画图时思路应该清晰一点.我是将坐标\((x,y)\)映射到\(canvas[y][x]\)上. 连线注意\(+\)号的情况,填充写好\(dfs\)就好了. #include <bits/stdc ...

  4. CCF-CSP题解 201703-3 Markdown

    要求实现简易的Markdown到Html格式的转换. 主要就是字符串处理.以空行划分各个区块,区块内部字符的输出用一个\(print\_buf\)实现,至于强调和超链接的嵌套,则可以递归实现. 注意用 ...

  5. Java内存模型之原子性问题

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 前言 之前的文章中讲到,JMM是内存模型规范在Java语 ...

  6. 《Java Spring框架》基于IDEA搭建Spring源码

    第一步: IDEA :IntelliJ IDEA 2018.1.4    :JDK安装(必须1.8或者以上),IDEA安装(过程省略). 第二步: Gradle:下载地址:https://servic ...

  7. Git之将master合并到自己分支

    工作中常常需要将master合并到自己的分支,这次就记录一下这个过程. 1.切换到master主分支上 git checkout master 2.将master更新的代码pull到本地 git pu ...

  8. Android JSON解析插件

    JSON是一种轻量级的数据格式,用于数据的交互. Android交互数据主要两种方式:JSON和 XML.XML格式比JSON格式数量略大,所以大多都使用Json数据格式. 在Android开发的过程 ...

  9. 区块链技术驱动金融.mobi

    链接:https://pan.baidu.com/s/1yY8f_PglsPoudb76nru9Ig 提取码:c58o 想一起学习区块链的朋友可以加好友一个学习哦,共同进步

  10. centos和rhel中软件包管理常用命令

    软件包管理的常用命令  rpm软件包的管理  查询类: rpm  -q 软件包的查询: rpm  -q  软件包的名字   //你的记住软件包完整名字 模糊查询:rpm  -qa  |  grep   ...