Go語言觀感

簡潔的語法

雖然看了很多批判go語法的文章榜聂,但是荤懂,我個人還是很喜歡go的風格的燎潮,產品的功能應該做到少即使多蔑滓,就像喬布斯把手機上的按鍵縮減到一個

下面就簡單介紹幾個我比較喜歡的點

多返回值與返回值命名
  • 錯誤處理
//傳統(tǒng)的異常處理
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循環(huán)的時候使用
//平行賦值版本拆宛,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
數(shù)組的值傳遞

記得面試的時候經常有人會問讼撒,某某語言是引用傳遞還是值傳遞浑厚。這個時候,你就要具體問題決堤分析根盒,告訴他xx類型是引用的钳幅,xx類型是值傳遞
而在Go中,沒有具體問題具體分析這么一說炎滞,全都是值傳遞敢艰,為了充分體現(xiàn)這一驚人,我們以數(shù)組為例子

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 關鍵字后面的表達式,會在函數(shù)return之后執(zhí)行
  • 一個函數(shù)中可以有多個defer關鍵字森瘪,按照先進后出的順序執(zhí)行
func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}
  • defer 表達式的變量在定義的時候就已經確定了牡属,所以上面的輸出為0
func c() (i int) {
    defer func() { i++ }()
    return 1
}
  • defer表達式中可以修改函數(shù)中的命名返回值,雖然return的時候為1扼睬,但是調用方獲得的結果為2

友好的大兵團作戰(zhàn)工具

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就可以完成便利
  • 這里只是一個簡單的小例子废士,后面還會在這個話題上深入討論
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝇完,隨后出現(xiàn)的幾起案子官硝,更是在濱河造成了極大的恐慌矗蕊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氢架,死亡現(xiàn)場離奇詭異傻咖,居然都是意外死亡,警方通過查閱死者的電腦和手機岖研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門卿操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孙援,你說我怎么就攤上這事害淤。” “怎么了拓售?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵窥摄,是天一觀的道長。 經常有香客問我础淤,道長崭放,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任鸽凶,我火速辦了婚禮币砂,結果婚禮上,老公的妹妹穿的比我還像新娘玻侥。我一直安慰自己决摧,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布凑兰。 她就那樣靜靜地躺著蜜徽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票摇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天砚蓬,我揣著相機與錄音矢门,去河邊找鬼。 笑死灰蛙,一個胖子當著我的面吹牛祟剔,可吹牛的內容都是我干的。 我是一名探鬼主播摩梧,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼物延,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仅父?” 一聲冷哼從身側響起叛薯,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤浑吟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耗溜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體组力,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年抖拴,在試婚紗的時候發(fā)現(xiàn)自己被綠了燎字。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡阿宅,死狀恐怖候衍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洒放,我是刑警寧澤蛉鹿,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站拉馋,受9級特大地震影響榨为,放射性物質發(fā)生泄漏。R本人自食惡果不足惜煌茴,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一随闺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔓腐,春花似錦矩乐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傀蓉,卻和暖如春欧漱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葬燎。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工误甚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谱净。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓窑邦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壕探。 傳聞我的和親對象是個殘疾皇子冈钦,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • 出處---Go編程語言 歡迎來到 Go 編程語言指南。本指南涵蓋了該語言的大部分重要特性 Go 語言的交互式簡介李请,...
    Tuberose閱讀 18,409評論 1 46
  • 官方網站:https://golang.org/標準庫文檔:https://golang.org/pkg/在線編碼...
    技術學習閱讀 2,324評論 2 39
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理瞧筛,服務發(fā)現(xiàn)厉熟,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 前言 人生苦多驾窟,快來 Kotlin 庆猫,快速學習Kotlin! 什么是Kotlin绅络? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,168評論 9 118
  • 從官網下載最新安裝包月培, 我這里下載的是redis-3.2.5.tar.gz 然后進行解壓tar zxvf redi...
    冰冰大象閱讀 267評論 0 1