文档中详细描述了在 Uber 编写 Go 代码的注意事项,某某语言是引用传递还是值传递

  • 栏目:基础 时间:2020-04-10 21:10
<返回列表

Uber 近日开放了其公司内部使用的《Go 语言风格指南》。

简洁的语法

虽然看了很多批判go语法的文章,但是,我个人还是很喜欢go的风格的,产品的功能应该做到少即使多,就像乔布斯把手机上的按键缩减到一个

下面就简单介绍几个我比较喜欢的点

图片 1

多返回值与返回值命名
//传统的异常处理
try{
  var data = fs.readFile();
}catch(e){
  print("文件读取错误")
}

//利用多返回值
data,err := fs.readFile()
if(err){
  print("文件读取错误")
}
func readFull(r io.Reader, buf []byte) (int, error) {
    var n int
    var err error
    for len(buf) > 0 {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        if err != nil {
            return n, err
        }
        buf = buf[nr:]
    }
    return n, err
}

func readFullV2(r io.Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        buf = buf[nr:]
    }
    return  // 在返回值列表中对变量声明,则可以不必再return语句中写死
}

Uber 介绍,“风格”也就是支配我们代码的惯例,该指南出现在 Uber 公司内部是为了使代码库易于管理,同时让工程师有效地使用 Go 语言特性。

break到你想要的地方
TARGET:
    for j := 0; j < 5; j++ {
        for i := 0; i < 10; i++ {
            if i > 5 {
                break TARGET
            }
            fmt.Println(i)
        }
    }
输出结果:
0
1
2
3
4
5

文档中详细描述了在 Uber 编写 Go 代码的注意事项,具体列出来的是“Dos and Don'ts of writing Go code at Uber”,也就是不该怎样写,而应该怎样写 Go 代码。

平行赋值
//平行赋值版本,go认为平行赋值比较简洁,所以在for的时候强制使用这种方式
for i, j := 1, 2; i < 10; i, j = i+1, j+1 {
        fmt.Println(i, j)
}

//非平行赋值版本
for(i =0,j=1;i<10;i=i+1,j=j+1){
    console.log(i,j)
}
//从map中获取key对应的value
myMap := make(map[string]string)
if value, ok := myMap["aaa"]; ok {
    fmt.Println(value)
} else {
    fmt.Println("not find")
}
i,j = j,i

其中许多约定是 Go 的通用准则,而其它准则则参考了外部资源:

数组的值传递

记得面试的时候经常有人会问,某某语言是引用传递还是值传递。这个时候,你就要具体问题决堤分析,告诉他xx类型是引用的,xx类型是值传递
而在Go中,没有具体问题具体分析这么一说,全都是值传递,为了充分体现这一惊人,我们以数组为例子

func demoArray(eles [5]int) {
    eles[0] = -1
}

func main() {
    data := [5]int{1, 2, 3, 4, 5}
    demoArray(data)
    fmt.Println(data)//demoArray中的修改对data并不起作用
}
//输出
[1 2 3 4 5]
defer关键字
package main

import (
    "fmt"
    "os"
)

func main() {
    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}
func createFile(p string) *os.File {
    fmt.Println("creating")
    f, err := os.Create(p)
    if err != nil {
        panic(err)
    }
    return f
}
func writeFile(f *os.File) {
    fmt.Println("writing")
    fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
    fmt.Println("closing")
    f.Close()
}
//输出
creating
writing
closing
func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}
func c() (i int) {
    defer func() { i++ }()
    return 1
}

指南涵盖了“指导方针”、“性能”、“风格”与“模式”几个大模块,下设各项具体的注意事项:

友好的大兵团作战工具

图片 2

godoc

godoc可以将你本地的go package展示出来,如下所示:

//Package docDemo is a package using demonstrate godoc tool
package docDemo

import "io"

// ReadFullV2 is a demo of name return value
func ReadFullV2(r io.Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        buf = buf[nr:]
    }
    return
}

图片 3

demo1.png

以“Defer to Clean Up(使用 defer 清理)”小节为例,该指南这样描述:

cgo
package main

/*
#include <stdio.h>
void hello(){
    printf("Hello,Cgon");
}
*/
import "C"

func main() {
    C.hello()
}

上面的小demo展示了,使用C语言打印一个hello

使用 defer 清理资源,例如文件和锁。

Bad Good

p.Lock()
if p.count < 10 {
  p.Unlock()
  return p.count
}

p.count++
newCount := p.count
p.Unlock()

return newCount

// easy to miss unlocks due to multiple returns

p.Lock()
defer p.Unlock()

if p.count < 10 {
  return p.count
}

p.count++
return p.count

// more readable

defer 的开销非常小,只有在可以证明函数执行时间处于纳秒级的程度时,才应避免使用。使用 defer 可以获得更好的代码可读性,而它的开销相比来说可以忽略不计。对于具有更多更大内存访问的方法来说 defer 会显得更加重要。

详情查看该指南:

(文/开源中国)    

上一篇:没有了 下一篇:没有了

更多阅读

文档中详细描述了在 Uber 编写 Go 代码的注

基础 2020-04-10
Uber 近日开放了其公司内部使用的《Go 语言风格指南》。 简洁的语法 虽然看了很多批判go语法...
查看全文

微软准备不想让用户从Windows 10,也不再出

基础 2020-04-10
根据 techdows 报道,微软不允许用户从Windows 10 中卸载 Chromium Edge 浏览器,现在基于Chromium ...
查看全文

14 的新特性,项新特性

基础 2020-04-10
JDK/Java 13 在一个月前已经发布,该版本带来了 5大新特性,笔者观察到其中的 TextBlocks(文本块...
查看全文

友情链接: 网站地图

Copyright © 2015-2019 http://www.koi-bumi.com. 韦德体育有限公司 版权所有