初次接触Go编程踩到的坑

最近想利用Go来写切图服务,没什么经验,遇到的问题比较多,下面就简单总结下,看到的同学们可以参考下吧。

设置HTTP response header不生效

由于响应的数据格式为JSON,所以想设置下Content-Type : application/json,代码如下

1
2
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")

结果在Header始终看不到期望结果,跟踪源码发现response中有wroteHeader字段标示。
得出结论,如果这两行代码都需要调用,就必须让 w.WriteHeader 在所有的 w.Header.Set 之后执行,才能生效。

执行os.MkdirAll("xx/xx/", 0666) 返回 permission denied错误

$HOME目录下,本地执行Shell命令mkdir -p xx/xx/却成功创建,更改第二个参数FileModeos.ModePerm也无济于事。
Google各种搜索后,尝试增加了两行代码,解决了问题,但目前还不清楚为什么,待解。

1
2
mask := syscall.Umask(0)
defer syscall.Umask(mask)

切图后image保存到本地抛出invalid memory address or nil pointer dereference异常

经过切图后得到thumb image.Image对象,已经定义好保存路径thumbPath string,保存到本地代码如下

1
2
3
4
5
buffer := new(bytes.Buffer)
if err := jpeg.Encode(buffer, thumb, nil); err != nil {
    log.Fatalln("unable to encode image.")
}
_ = ioutil.WriteFile(thumbPath, buffer.Bytes(), 0666)

在上传JPG图片是运行良好,但在处理PNG格式的图片时,出现error,解决方案是增加

1
import (_"image/png")

保存原图内容为空

保存原图时,想通过md5得到HASH字符串的文件名,之后再把文件保存在指定目录下。

1
2
3
md5h := md5.New()
io.Copy(md5h, file)
name := hex.EncodeToString(md5h.Sum([]byte("")))

结果发现保存的原图内容是0字节,怀疑就是这里把文件流读到末尾了。
改造代码就是在保存图片前调用file.Seek(0, 0),把offset设置为0恢复文件流。