goInActionNote(2)

chapter2

  • for range 返回的第二个值为遍历元素的副本
  • 未使用局部变量编译出错
  • interface如果只有一个方法,推荐er结尾的命名方式.
  • 对于任意receiver都可以调用,编译器自己解引用或引用,但是在interface实现区分

GoInAction 第二章学习之后自己将例子写了一遍并稍加修改.比如将结果写到文件中.其中遇到一些问题.

文件处理

1
2
//os.OpenFile
func OpenFile(name string, flag int, perm FileMode) (*File, error)

这个方法可以用来打开或者创建文件.不过需要给flag配以相应的值.比如os.O_CREATE|os.O_APPEND|os.O_WRONLY这就是存在文件则追加写,没有则创建文件.最后的os.O.WRONLY则是赋予只写模式.其中在这个过程中还遇到一个问题.提示
bad file descriptor这个错误.这个在Stackoverflow找到了解释,其实就和上面写的一样,创建就要给予os.O_CREATE,读写自然就要给予os.O_RDWRMode.

还有就是在go doc的时候看到说 most users will use Open or Create instead

这边则是用到的下面2个方法:

1
func Open(name string) (*File, error)

这个实际相当与os.OpenFile中以os.O_RDONLY返回文件

1
func Create(name string) (*File, error)

这个则是以0666的权限创建文件.flag则是O_RDWR|O_CREATE|O_TRUNC.这里则是读写权限,文件不存在则创建.重要的是os.O_TRUNC.如果文件存在他会将已有的文件清空然后返回文件.这里就需要配合判断文件是否存在

1
2
func Stat(name string) (FileInfo, error)
func IsExist(err error) bool
1
2
3
4
func FileIsExist(filePath string)bool{
_,err := os.Stat(filePath)
return err == nil || os.IsExist(err)
}

至于err == nil这段则是因为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func IsExist(err error) bool {
return isExist(err)
}
//这段是error_unix.go中的,但是err_windows.go中对于nil都是return false
func isExist(err error) bool {
switch pe := err.(type) {
case nil:
return false
case *PathError:
err = pe.Err
case *LinkError:
err = pe.Err
case *SyscallError:
err = pe.Err
}
return err == syscall.EEXIST || err == syscall.ENOTEMPTY || err == ErrExist
}

这里我写的时候就犯过错,我都是直接go doc看方法以及接口文档的,加上我英文其实不太好,
就犯错了.

学习过程中的例子我也放到GitHub上了.当然GoInAction的示例代码更加完整

客官扫码领红包哟~