关于go的不爽
2016-04-06 15:28
477 查看
这里想记录下,自己学习、使用go语言,对于go语言不爽的地方。
w.WriteString("hello world")
w.Flush()
注意:这里必须调用 w.Flush()才能将内容输出到文件,否则,内容还保存在缓存里,没有输出到文件。
这里range data 返回的是两个值,第一个是下标,第二个是数组下标对应的值。
如果是在Go语言别的地方,则必须用两个变量来接收值,但是在这里,却可以只用一个变量来接收值;此时接收的是数组下标值。
Go语言和标准的C语言一样并不支持重载(支持重载的那是C++,并不是标准C),所以如上的代码会编译出错。
特别是在使用数组的过程中,要严格区分开这个数组到底是某种数据类型的数组、还是某种数据类型指针的数组。
Go语言中,函数是值传递;没有意外地,数组的append操作也是值传递;那么,如果是数据类型数组,则append操作是拷贝数据类型值;如果是数据类型指针数组,则append操作拷贝的是指针的地址值。
如下,多了一行空行,则编译出错,报告类似"could not determine kind of name for C.FALSE"的错误,害我浪费了好多时间
代码如上,定义接口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) 错误。
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 = 17.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语言”奇怪用法“有哪些?
- django 分页
- 20 Tips To Use Google Search Efficiently
- codeforces_598D. Igor In the Museum(dfs)
- django之 文件上传功能(缺陷:无法改存放目录)
- django之创建第12个项目-加载图片
- django之创建第11个项目-页面整合
- category
- reload、replace、href、assign、window.history.go(0)的区别
- Go语言中的<断言>
- Action & Golf 四个魔法球实战训练系列_huatuo_新浪博客
- 工作笔记之安卓开机动画与logo修改
- CodeForces 658C Bear and Forgotten Tree 3(构造)
- 我与小娜(48):AlphaGo的增援学习是什么?
- django 学习 --- 环境搭建
- BZOJ 4281 [ONTAK2015]Związek Harcerstwa Bajtockiego 树上倍增
- django之创建第10-1个项目-图片上传并记录上传时间
- 【KM】POJ2195/HDU1533-Going home
- 深度解读 AlphaGo 算法原理
- django的下载安装以及第一个项目的创建