这里想记录下,自己学习、使用go语言,对于go语言不爽的地方。

1. 函数返回类型接在参数类型后面,不容易一眼看清楚函数的返回类型

  如下,是不是有种很花的感觉。

    func NewReader(s string) *Reader
func (r *Reader) Len() int
func (r *Reader) Read(b []byte) (n int, err error)
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
func (r *Reader) ReadByte() (b byte, err error)
func (r *Reader) ReadRune() (ch rune, size int, err error)
func (r *Reader) Seek(offset int64, whence int) (int64, error)
func (r *Reader) Size() int64
func (r *Reader) UnreadByte() error
func (r *Reader) UnreadRune() error
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)

2.函数声明的返回类型、和返回的值语法不一致

  如果返回类型 为多个,必须 使用括号(),而在函数体内返回的时候,又不能使用括号

func sawp(a int, b int) (r1 int, r2 int) {
return r2, r1 // 不能使用 return (r2, r1)
}

3.允许语句后面没有分号,导致切换到 C/C++的时候,已经习惯不加分号,编译错误  

  当然,写python的时候,也没有分号。可是python完全靠格式,不容易和C/C++混淆。Go的切换就那么习惯。

4.golang的scan系列函数及其难用

  scan系列函数不能按照行读取,而是把空格作为分隔符读取,虽然分行符也可以作为分隔符。必须使用bufio按行读取

5.atoi函数

  如果传入的字符串参数前后有空格,则转型失败,返回0;必须去除传入数字字符串前、后的空格

6. := 和 = 的区别

  := 必须 a := 1 这样使用;而 = 分两种,声明 var b int 和声明加定义 var b int = 1

7.error方式的错误处理

如果一个函数体内,要调用多个可能返回error错误的函数,每次调用语句之后都要写if语句判断是否出错,非常繁琐,远不如运行时异常方便简洁

v1, err = func1()
if err != nil {
...
}
v2, err = func2()
if err != nil {
...
}

  

void func() {
func1()
func2()
} try {
func()
} {
}

8. bufio的writer  

  w := bufio.NewWriter(filename)

  w.WriteString("hello world")

  w.Flush()

  注意:这里必须调用 w.Flush()才能将内容输出到文件,否则,内容还保存在缓存里,没有输出到文件。

9. range的不一致

data := []int {3, 2, 1}

for v := range data {
fmt.Println(v)

//输出
0
1
2

  这里range data 返回的是两个值,第一个是下标,第二个是数组下标对应的值。

  如果是在Go语言别的地方,则必须用两个变量来接收值,但是在这里,却可以只用一个变量来接收值;此时接收的是数组下标值。

10. 不支持重载

func QuickSort(data []int) {
n := len(data)
QuickSort(data, 0, n-1)
} func QuickSort(data []int, i, j int) {
pos := partition(data, i, j)
if pos > i {
QuickSort(data, i, pos-1)
}
if pos < j {
QuickSort(data, pos+1, j)
}
}

  Go语言和标准的C语言一样并不支持重载(支持重载的那是C++,并不是标准C),所以如上的代码会编译出错。

11. 指针定义方式,引用使用方式

  Go语言中也有指针;但是Go语言中的指针的概念是相当于C/C++中指针和引用的合体;定义方式和C/C++语言方式一样,但是使用方式却跟C++中的引用的使用方式一样

12. 操作符&的优先级小于操作符.

  在Go语言中,操作符&的优先级小于操作符.

13.数组指针和指针数组

  在Go语言中,要区分开数组的指针和某种类型指针构成的数组

var test []*Test //指针构成的数组
var testptr *[]Test = &[]Test{Test{}} //指向数组[]Test的指针

14.类似C/C++语言中的那样,数据类型值和数据类型指针的坑还存在

  由于在Go语言中,指针是显示存在的。所以一个变量,到底表示的是数据值还是指向数据值的指针要弄清楚。

  特别是在使用数组的过程中,要严格区分开这个数组到底是某种数据类型的数组、还是某种数据类型指针的数组。

  Go语言中,函数是值传递;没有意外地,数组的append操作也是值传递;那么,如果是数据类型数组,则append操作是拷贝数据类型值;如果是数据类型指针数组,则append操作拷贝的是指针的地址值。

15. cgo特殊注释和import "C" 之间不能有空行

  如下,则正常

// #cgo LDFLAGS: -Lc/x64 -lbass
// #include "./c/bass.h"
import "C"

  如下,多了一行空行,则编译出错,报告类似"could not determine kind of name for C.FALSE"的错误,害我浪费了好多时间

// #cgo LDFLAGS: -Lc/x64 -lbass
// #include "./c/bass.h" import "C"

15. 接口类型使用不一致

type Server interface {
Name() string
Handle(method, params string) *Response
} type IpcServer struct {
Server
} func NewIpcServer(server Server) *IpcServer {
return &IpcServer{server}
} type EchoServer struct {
} func (server *EchoServer) Handle(method, params string) *Response {
return &Response{"OK", "ECHO: " + method + " ~ " + params}
} func (Server *EchoServer) Name() string {
return "EchoServer"
}

  代码如上,定义接口Server,以及实现了接口Server中方法的结构体IpcServer。但在实现接口方法的时候,接收者使用的是*IpcServer类型并不是IpcServer类型,那么IpcServer只能用来做为*Server类型来使用。

  即,代码 server := NewIpcServer(&EchoServer{}) 正确;

  但,代码 server := NewIpcServer(EchoServer{}),编译正常。但运行时则会报告  cannot use EchoServer literal (type EchoServer) as type Server in argument to NewIpcServer: EchoServer does not implement Server (Handle method has pointer receiver) 错误。

16. goroutine的运行 

  main方法的协程并不会等待其他的协程执行。当main方法的协程执行完毕,程序就结束。因此在main方法里要显示加入等待其他协程执行完毕的通知。

#### 持续等待更新 ####

关于go的不爽的更多相关文章

  1. 说一说python的牛比与不爽

    本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...

  2. 常用的sublime text插件(很爽哦)

    个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...

  3. 很多事情就像看A片,看的人觉得很爽,做的人未必。

    http://m.jingdianju.com/wzgs/shenghuo/201307185135.html 转载自: 从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作 ...

  4. java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  5. Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介

    热更新 天下武功,无坚不破,唯快不破 热更新就是为了更快的把内容推到用户手中. 之前,我设计了C#Light,经过半年多的持续修补,勉强可用,磕磕绊绊.感谢那些,试过,骂过,用过的朋友,在你们的陪伴下 ...

  6. AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方

    下边有个 循环调用线程写奇偶数的程序 class TheadTest { //定义一个Stream对象接收打开文件 private FileStream st; //构造方法 public Thead ...

  7. sublime构建执行go程序真爽

    1.安装gosublime插件 2.直接在sublime下调试运行共程序,不用去cmd了: 选择编译系统,编译,出现下面的模拟命令行,直接执行go的命令即可,比如go run process.go,结 ...

  8. 去掉 Android工程中让人很不爽的“黄色警告”

    一:问题       二:解决方法 (1)选择android工程,右键Android Tools —> Clear Lint Markers 这种方式能够清除android工程里面的所有警告信息 ...

  9. 20135335郝爽 & 20135304刘世鹏 实验一

    北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                                                      ...

  10. 各种设备的CSS3 MediaQuery整理及爽歪歪写法

    链接:http://dwz.cn/1gZQ06 ------------------------------------------------------ 备注:内容未测试过,转载的,留着备用. - ...

随机推荐

  1. Linux中切换用户变成-bash4.1-$的解决方法【转】

    转自 Linux中切换用户变成-bash4.1-$的解决方法 - xia_xia的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/xia_xia0919/articl ...

  2. ajax学习之post请求步骤

    ajax学习之post请求步骤 蚣汉御豁 讼护尧 娉郐皑 磲 力豪强的虎视眈眈相信过不了 觏随迦趾 怪了灵敏儿竟然不慌不忙的也没有来找她们 缸轰诎 ?ê戆冼 跄鲅胗绩 掳戈玉孑 馀模嗷婧 ...

  3. 一个字符串搜索的Aho-Corasick算法

    Aho和Corasick对KMP算法(Knuth–Morris–Pratt algorithm)进行了改进,Aho-Corasick算法(Aho-Corasick algorithm)利用构建树,总时 ...

  4. 多项目中SVN权限管理精辟解析

    本节和大家讨论一下多项目SVN权限管理,主要包括建立版本库,修改版本库配置文件,配置允许访问的用户,设置用户访问权限.下面我们就来看一下SVN权限管理.svn权限管理svn的权限管理涉及到一下文件:p ...

  5. mxml日期显示使用

    mxml代码: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx= ...

  6. OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结

    周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...

  7. C#抓取页面时候,获取页面跳转后的地址

    static string fanhuiurl(string cahxunurl) { string url = ""; HttpWebRequest req = (HttpWeb ...

  8. UVA 11992 线段树

    input r c m      r<=20,1<=m<=20000 m行操作 1 x1 y1 x2 y2 v       add v 2 x1 y1 x2 y2 v       s ...

  9. linux视频学习(简单介绍)20160405

    看一周学会linux系统的学习笔记. 1.linux系统是一个安全性高的开源,免费的多用户多任务的操作系统. 2.linux工作分为linux系统管理员,linux程序员(PC上软件开发,嵌入式开发) ...

  10. Setting DPDK+OVS+QEMU on CentOS

    Environment Build Step: these packages are needed for building dpdk+ovs: yum install -y make gcc gli ...