美文网首页
Go语言观感

Go语言观感

作者: AcceptedLc | 来源:发表于2017-03-07 17:44 被阅读32次

简洁的语法

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

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

多返回值与返回值命名
  • 错误处理
//传统的异常处理
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语句中写死
}
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
平行赋值
  • for循环的时候使用
//平行赋值版本,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)
}
  • if 的时候使用
//从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
数组的值传递

记得面试的时候经常有人会问,某某语言是引用传递还是值传递。这个时候,你就要具体问题决堤分析,告诉他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
  • defer关键字,主要作用是清理资源,替代了原先的try...catch...finally
  • defer 关键字后面的表达式,会在函数return之后执行
  • 一个函数中可以有多个defer关键字,按照先进后出的顺序执行
func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}
  • defer 表达式的变量在定义的时候就已经确定了,所以上面的输出为0
func c() (i int) {
    defer func() { i++ }()
    return 1
}
  • defer表达式中可以修改函数中的命名返回值,虽然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
}
demo1.png
cgo
package main

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

func main() {
    C.hello()
}

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

  • 在go文件中import "C"表示这是一个带有Cgo代码的Go文件
  • import前的注释可以写你想嵌入的c代码
  • go安装的时候,会自带一个cgo命令行工具,他用来处理所有带Cgo代码的Go文件
  • 而go 语言的编辑器对于cgo进行了集成,因此,直接使用go build就可以完成便利
  • 这里只是一个简单的小例子,后面还会在这个话题上深入讨论

相关文章

  • Go语言观感

    简洁的语法 虽然看了很多批判go语法的文章,但是,我个人还是很喜欢go的风格的,产品的功能应该做到少即使多,就像乔...

  • Go语言初步观感

    这两年Golang比较火,抽了几天学习了一下,发现了Go的一些特点. 优点 代码简洁,可以不用加分号,很多地方不用...

  • 潍坊go语言培训

    潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • Go 语言学习技巧和编程思维

    Go 语言学习技巧和编程思维 一、了解 Go 语言 了解 Go 语言背景 学习 Go 语言,首先要了解 Go 语言...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • go语言基础

    go语言基础 go 语言接口

  • GO语言——入门(1)

    一、初识GO语言 1.GO语言介绍 1.1 GO语言是什么 2009年11月10日,GO语言正式成为开源编程语言家...

  • ByteEdu Go语言基础+视频教程

    第一节 Go语言简介 + Go语言编码规范 视频地址:Go语言简介 第二节 Go语言环境安装 ...

  • golang的helloworld

    go语言初识 go语言的变量

网友评论

      本文标题:Go语言观感

      本文链接:https://www.haomeiwen.com/subject/fuszwttx.html