對比學習:Golang VS Python3

image.png

Golang和Python都是目前在各自領域最流行的開發(fā)語言之一。

Golang其高效而又友好的語法冗锁,贏得了很多后端開發(fā)人員的青睞齐唆,最適用于高并發(fā)網絡編程的語言之一。

Python不用說冻河,TIOBE排行榜的前十常駐居民箍邮,現(xiàn)在已經穩(wěn)定在前五了茉帅。在機器學習、AI锭弊、數(shù)據(jù)分析領域成為必學語言堪澎。

兩門編程語言在語法上都有各自的特點,而且都易學易用味滞。

本文對比這兩門語言目的不是爭誰優(yōu)誰略樱蛤,只是為了對比學習,適合掌握Python想學Go或者掌握Go想學Python的同學們參考剑鞍。

Go和Python昨凡,一個是靜態(tài)語言一個是動態(tài)語言,從各個方面來看攒暇,都有根本性的差異土匀,所以,文中很多內容不進行深入的比較了形用,我們只從程序員最直觀的語法面做對比就轧。

為了便于閱讀,文中涉及代碼都采用盡量簡單的語句呈現(xiàn)

字符編碼

Python

Python2中默認的編碼格式是 ASCII 格式田度,程序文件中如果包含中文字符(包括注釋部分)需要在文件開頭加上 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了

Python3默認支持Unicode

Golang

原生支持Unicode

保留字(關鍵字)

Python

30個關鍵字

and exec    not
assert  finally or
break   for pass
class   from    print
continue global raise
def if  return
del import  try
elif    in  while
else    is  with
except  lambda  yield
復制代碼

Golang

25個關鍵字

break   default func    interface   select
case    defer   go  map struct
chan    else    goto    package switch
const   fallthrough if  range   type
continue    for import  return  var
復制代碼

注釋

Python

# 單行注釋

'''
多行注釋
多行注釋
'''

"""
多行注釋
多行注釋
"""

復制代碼

Golang

//單行注釋

/*
多行注釋
多行注釋
*/
復制代碼

變量賦值

Python

Python是動態(tài)語言妒御,所以在定義變量的時候不需要申明類型,直接使用即可镇饺。 Python會根據(jù)值判斷類型乎莉。

name = "Zeta" # 字符串變量
age = 38 # 整數(shù)
income = 1.23 # 浮點數(shù)
復制代碼

多變量賦值

a,b = 1,2 # a=1; b=2
c = d = 3 # c=3; d=3
復制代碼

Golang

Go是靜態(tài)語言,是強類型的奸笤,但是Go語言也允許在賦值變量時確定類型惋啃。

因此Go有多種申明變量的方式

// 1\. 完整的申明并賦值
var a int
a = 1

// 2\. 聲明變量類型同時賦值
var a int = 1

// 3\. 不聲明類型,賦值時確定
var a = 1

// 4\. 不用 var 關鍵字申明變量并賦值后確定類型
a := 1
復制代碼

注意监右,Go中的new關鍵字并不是聲明變量边灭,而是返回該類型的指針

a := new(int) //這時候a是一個*int指針變量
復制代碼

標準數(shù)據(jù)類型

Python 的標準數(shù)據(jù)類型有:

  • Boolean(布爾值)
  • Number(數(shù)字)
  • String(字符串)
  • List(列表)
  • Tuple(元組)
  • Set(集合)
  • Dictionary(字典)

Golang

  • boolean(布爾值)
  • numeric(數(shù)字)
  • string(字符串)
  • 數(shù)組(數(shù)組)
  • slice(切片:不定長數(shù)組)
  • map(字典)
  • struct(結構體)
  • pointer(指針)
  • function(函數(shù))
  • interface(接口)
  • channel(通道)

總結

Python中的List列表對應Go語言中的Slice切片

Python中的Dictionary字典對應Go語言中的map

有一些值得注意的地方:

  • Go是支持函數(shù)編程的語言,所以在Go語言中函數(shù)是一個類型
  • Go語言不是面向對象的語言健盒,沒有定義類的關鍵字Class绒瘦,要實現(xiàn)OOP風格編程,是通過struct扣癣、interface類型實現(xiàn)的
  • Python中的元組和集合在Go中都沒有
  • channel是Go里獨有的類型惰帽,多線程之間的通信就靠它

數(shù)據(jù)類型轉換

Python

Python類型轉換非常簡單,用類型名作為函數(shù)名即可父虑。

int(n)            # 將數(shù)字n轉換為一個整數(shù)
float(n)          # 將數(shù)字n轉換到一個浮點數(shù)
str(o)            # 將對象 obj 轉換為字符串
tuple(s)          # 將序列 s 轉換為一個元組
list(s)           # 將序列 s 轉換為一個列表
set(s)            # 將序列 s 轉換為一個集合
復制代碼

Golang

Go語言的基礎類型轉換和Python差不多该酗,也是用類型名作為函數(shù)名

i := 1024
f := float32(i)
i = float32(f)
復制代碼

另外,Python中可以直接轉換數(shù)字字符串和數(shù)字:

s = "123"
i = 456
print(int(s), str(i))
復制代碼

但是Go是不可以的士嚎。

Go語言的字符串處理很不同垂涯,string()只能用于[]byte類型轉換成字符串烁焙,其他基礎類型的轉換需要用strconv包,另外耕赘,其他類型轉換成為string類型除了用strconv包,還可以用fmt.Sprintf函數(shù):

package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "123"
    i, _ := strconv.Atoi(s)
    println(i)

    s2 := fmt.Sprintf("%d", 456)
    println(s2)
}
復制代碼

Go中的interface類型是不能直接轉換成其他類型的膳殷,需要使用到斷言

package main

func main() {
var itf interface{} = 1
i, ok := itf.(string)
println("值:", i, "; 斷言結果", ok)

j, ok := itf.(int)
println("值:", j, "; 斷言結果", ok)
}
復制代碼

輸出為:

值:  ; 斷言結果 false
值: 1 ; 斷言結果 true
復制代碼

條件語句

Python

Python傳統(tǒng)的判斷語句如下

if name == 'zeta':          # 判斷變量是否為 zeta 
    print('Welcome boss')   # 并輸出歡迎信息
else:
    print('Hi, ' + name)  
復制代碼

Python不支持三元表達式操骡,但是可以用一種類似的替代辦法

title = "boss"
name = "zeta" if title == "boss" else "chow"
print(name)
復制代碼

邏輯與用 and ,邏輯或用 or

Golang

Go的if的語法類似Java赚窃,但是表達式不需要使用()

if a > b{
    println("a > b")
} else {
    println("a <= b")
}
復制代碼

Go同樣沒有三元表達式册招,并且也沒有什么替代方法。

另外勒极,Go允許在if的表達式里定義變量是掰,定義并賦值的表達式與判斷的表達式用;隔開,常見的情況是獲取函數(shù)返回error辱匿,然后判斷error是否為空:

if err := foo(); err != nil {
    println("發(fā)生一些錯誤")
} 
復制代碼

與Python不同键痛,邏輯與用 &&, 邏輯或用||

循環(huán)語句

Python

Python中有whilefor兩種循環(huán)匾七,都可以使用break跳出循環(huán)和continue立即進入下一輪循環(huán)絮短,另外,Python的循環(huán)語句還可以用else執(zhí)行循環(huán)全部完畢后的代碼昨忆,break跳出后不會執(zhí)行else的代碼

while 條件循環(huán)丁频,

count = 0
while (count < 9):
    print('The count is:', count)
    count = count + 1
    if count == 5:
        break   # 可以比較以下break和不break的區(qū)別
        pass
else:
    print('loop over')
復制代碼

for 遍歷循環(huán),循環(huán)遍歷所有序列對象的子項

names = ['zeta', 'chow',  'world']
for n in names:
    print('Hello, ' + n)
    if n == 'world':
        break
        pass
else:
    print('Good night!')
復制代碼

for循環(huán)中也可以用else邑贴,(注釋掉代碼中的break試試看席里。)

Golang

Go語言只有一個循環(huán)語句for,但是根據(jù)不同的表達式拢驾,for有不同的表現(xiàn)

for 前置表達式; 條件表達式; 后置表達式 {
    //...
}
復制代碼

前置表達式 在每輪循環(huán)前運行奖磁,可以用于聲明變量或調用函數(shù)返回; 條件表達式 滿足該表達式則執(zhí)行下一輪循環(huán)独旷,否則退出循環(huán); 后置表達式 在循環(huán)完成后執(zhí)行

經典的用法:

for i := 0; i < 10; i++ {
    println(i)
}
復制代碼

我們可以忽略掉前置和后置表達式

sum := 1
for sum < 10 {
    sum += sum
}
復制代碼

設置可以忽略掉全部表達式署穗,也就是無限循環(huán)

for {
    print(".")
}
復制代碼

Go的for循環(huán)同樣可以使用 break退出循環(huán)和continue立即進行下一輪循環(huán)。

for除了配合表達式循環(huán)嵌洼,同樣也可以用于遍歷循環(huán)案疲,需要用到range關鍵字

names := []string{"zeta", "chow", "world"}
for i, n := range names {
    println(i,"Hello, " + n)
}
復制代碼

函數(shù)

Python

def關鍵字定義函數(shù),并且在Python中,作為腳本語言,調用函數(shù)必須在定義函數(shù)之后场靴。

def foo(name):
    print("hello, "+name)
    pass

foo("zeta")
復制代碼

默認參數(shù) Python定義函數(shù)參數(shù)時芽隆,可以設置默認值涧郊,調用時如果沒有傳遞該參數(shù)武通,函數(shù)內將使用默認值渴频,默認值參數(shù)必須放在無默認值參數(shù)后面桑驱。

def foo(name="zeta"):
    print("hello, "+name)
    pass

foo()
復制代碼

關鍵字參數(shù) 一般函數(shù)傳遞參數(shù)時懂盐,必須按照參數(shù)定于的順序傳遞褥赊,但是Python中,允許使用關鍵字參數(shù)莉恼,這樣通過指定參數(shù)明拌喉,可以不按照函數(shù)定義參數(shù)的順序傳遞參數(shù)。

def foo(age, name="zeta"):
    print("hello, "+name+"; age="+str(age))
    pass

foo(name="chow", age=18)
復制代碼

不定長參數(shù)俐银,Python支持不定長參數(shù)尿背,用*定義參數(shù)名,調用時多個參數(shù)將作為一個元祖?zhèn)鬟f到函數(shù)內

def foo(*names):
    for n in names:
        print("hello, "+n)
    pass

foo("zeta", "chow", "world")
復制代碼

return 返回函數(shù)結果捶惜。

Golang

Go用func定義函數(shù)田藐,沒有默認值參數(shù)、沒有關鍵字參數(shù)吱七,但是有很多其他特征汽久。

func main() {
    println(foo(18, "zeta"))
}

func foo(age int, name string) (r string) {
    r = fmt.Sprintf("myname is %s , age %d", name, age)
    return 
}
復制代碼

函數(shù)的定義和調用沒有順序的限制。

Go的函數(shù)不僅可以定義函數(shù)返回值類型陪捷,還可以申明返回值變量回窘,當定義了返回值變量時,函數(shù)內的return語句可以不需要帶返回值市袖,函數(shù)會默認使用返回值變量返回啡直。

可變參數(shù)

使用…類型定義可變參數(shù),函數(shù)內獲得的參數(shù)實際是該類型slice對象

func main() {
    println(foo(18, “zeta”, “chow”, “world”))
}

func foo(age int, names …string) (r string) {
    for _, n := range names {
        r += fmt.Sprintf(“myname is %s , age %d \n”, n, age)
    }

    return
}
復制代碼

defer句

defer語句后面指定一個函數(shù)苍碟,該函數(shù)會延遲到本函數(shù)return后再執(zhí)行酒觅。

defer語句在Go語言中非常有用,詳細可以查閱本專欄的另一篇文章《Golang研學:如何掌握并用好defer(延遲執(zhí)行)

func foo() {
    defer fmt.Println("defer run")
    fmt.Println("Hello world")
    return
}
復制代碼

運行結果:

Hello world
defer run
復制代碼

另外微峰,在Go語言中函數(shù)也是類型舷丹,可以作為參數(shù)傳遞給別的函數(shù)

func main() {
    n := foo(func(i int, j int) int {
        return i + j
    })
    println(n)
}

func foo(af func(int, int) int) int {
    return af(1, 2)
}
復制代碼

上面這個例子直接在參數(shù)定義時使用函數(shù)類型,看上去有點混亂

再看來看一個清晰并完整的例子蜓肆,說明全在注釋里颜凯。

package main

type math func(int, int) int //定義一個函數(shù)類型,兩個int參數(shù)仗扬,一個int返回值

//定義一個函數(shù)add症概,這個函數(shù)兩個int參數(shù)一個int返回值,與math類型相符
func add(i int, j int) int {
    return i + j
}

//再定義一個multiply早芭,這個函數(shù)同樣符合math類型
func multiply(i, j int) int {
    return i * j
}

//foo函數(shù)彼城,需要一個math類型的參數(shù),用math類型的函數(shù)計算第2和第3個參數(shù)數(shù)字,并返回計算結果
//稍后在main中我們將add函數(shù)和multiply分別作為參數(shù)傳遞給它
func foo(m math, n1, n2 int) int {
    return m(1, 2)
}

func main() {
    //傳遞add函數(shù)和兩個數(shù)字募壕,計算相加結果
    n := foo(add, 1, 2)
    println(n)

    //傳遞multply和兩個數(shù)字调炬,計算相乘結果
    n = foo(multiply, 1, 2)
    println(n)
}
復制代碼

結果

3
2
復制代碼

模塊

Python

  • 模塊是一個.py文件
  • 模塊在第一次被導入時執(zhí)行
  • 一個下劃線定義保護級變量和函數(shù),兩個下劃線定義私有變量和函數(shù)
  • 導入模塊習慣性在腳本頂部舱馅,但是不強制

Golang

  • 與文件和文件名無關,每一個文件第一行用package定義包名代嗤,相同包名為一個包
  • 包中的變量第一次引用時初始化匀谣,如果包中包含init函數(shù),也會在第一次引用時執(zhí)行(變量初始化后)
  • 保重首寫字母大寫的函數(shù)和變量為共有资溃,小寫字母為私有,Golang不是面向對象的烈炭,所以不存在保護級溶锭。
  • 導入模塊必須寫在package之后,其他代碼之前符隙。

導入包

Python

在Python中趴捅,使用import導入模塊。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 導入模塊
import support

support.print_func(“Runoob”)
復制代碼

還可以使用from import導入模塊指定部分

from modname import name1[, name2[, ... nameN]]
復制代碼

為導入的包設置別名用 as關鍵字

import datetime as dt
復制代碼

Golang

也是使用import導入包霹疫,導入包指定的是包的路徑拱绑,包名默認為路徑中的最后部分

import "net/url" //導入url包
復制代碼

多個包可以用()組合導入

import (
    "fmt"
    "net/url"
)
復制代碼

為導入的包設置別名, 直接在導入包時,直接在報名前面添加別名丽蝎,用空格隔開

import (
    f "fmt"
  u "net/url"
)
復制代碼

錯誤和異常

Python

Python中用經典的 try/except 捕獲異常

try:
<語句>        #運行別的代碼
except <異常名稱>:
<語句>        #
except <異常名稱>猎拨,<數(shù)據(jù)>:
<語句>        #如果引發(fā)了指定名稱的異常,獲得附加的數(shù)據(jù)
復制代碼

還提供了 elsefinally

如果沒發(fā)生異常的執(zhí)行else語句塊屠阻,finally塊的代碼無論是否捕獲異常都會執(zhí)行

Python內建了很全面的異常類型名稱红省,同時能自定義異常類型

Golang

Golang里沒有用經典的 try/except捕獲異常。

Golang提供兩種錯誤處理方式

  1. 函數(shù)返回error類型對象判斷錯誤
  2. panic異常

一般情況下在Go里只使用error類型判斷錯誤国觉,Go官方希望開發(fā)者能夠很清楚的掌控所有的異常吧恃,在每一個可能出現(xiàn)異常的地方都返回或判斷error是否存在。

error是一個內置的接口類型

type error interface {
    Error() string
}
復制代碼

通常麻诀,使用error異常處理類似這樣:

package main

import "fmt"

func foo(i int, j int) (r int, err error) {
    if j == 0 {
        err = fmt.Errorf("參數(shù)2不能為 %d", j) //給err變量賦值一個error對象
        return //返回r和err痕寓,因為定義了返回值變量名,所以不需要在這里寫返回變量
    }

    return i / j, err //如果沒有賦值error給err變量蝇闭,err是nil
}

func main() {
    //傳遞add函數(shù)和兩個數(shù)字呻率,計算相加結果
    n, err := foo(100, 0)
    if err != nil { //判斷返回的err變量是否為nil,如果不是丁眼,說明函數(shù)調用出錯筷凤,打印錯誤內容
        println(err.Error())
    } else {
        println(n)
    }
}
復制代碼

panic可以手工調用,但是Golang官方建議盡量不要使用panic,每一個異常都應該用error對象捕獲藐守。

Go語言在一些情況下會觸發(fā)內建的panic挪丢,例如 0 除、數(shù)組越界等卢厂,修改一下上面的例子乾蓬,我們讓函數(shù)引起0除panic

package main

func foo(i int, j int) (r int) {
    return i / j
}

func main() {
    //傳遞add函數(shù)和兩個數(shù)字,計算相加結果
    n := foo(100, 0)
    println(n)
}
復制代碼

運行后會出現(xiàn)

panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.foo(...)
        /lang.go:4
main.main()
        /lang.go:9 +0x12
exit status 2
復制代碼

手工panic可以這樣:

func foo(i int, j int) (r int) {
    if j == 0 {
        panic("panic說明: j為0")
    }
    return i / j
}
復制代碼

運行后慎恒,可以看到任内,錯誤消息的第一句:

panic: panic說明: j為0
復制代碼

面向對象

Python

Python完全支持面向對象的。

Golang

盡管Go語言允許面向對象的風格編程融柬,但是本身并不是面向對象的

官方FAQ原文

Is Go an object-oriented language?

Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. The concept of “interface” in Go provides a different approach that we believe is easy to use and in some ways more general. There are also ways to embed types in other types to provide something analogous—but not identical—to subclassing. Moreover, methods in Go are more general than in C++ or Java: they can be defined for any sort of data, even built-in types such as plain, “unboxed” integers. They are not restricted to structs (classes).

多線程

Python

  1. 使用thread模塊中的start_new_thread()函數(shù)
  2. 使用threading模塊創(chuàng)建線程

Golang

用關鍵 go創(chuàng)建協(xié)程goroutine

go關鍵字后指定函數(shù)死嗦,將會開啟一個協(xié)程運行該函數(shù)。

package main

import (
    "fmt"
    "time"
)

func foo() {
    for i := 0; i < 5; i++ {
        fmt.Println("loop in foo:", i)
        time.Sleep(1 * time.Second)
    }
}

func main() {
    go foo()

    for i := 0; i < 5; i++ {
        fmt.Println("loop in main:", i)
        time.Sleep(1 * time.Second)
    }
    time.Sleep(6 * time.Second)
}
復制代碼

Go語言中粒氧,協(xié)程之間的通信是通過channel實現(xiàn)的:

package main

import (
    "fmt"
    "time"
)

//接受一個chan類型的參數(shù)c
func foo(c chan int) { 
    time.Sleep(1 * time.Second) //等待1秒
    c <- 1024                   //向c中寫入數(shù)字
}

func main() {
    c := make(chan int) //創(chuàng)建chan變量c
    go foo(c)           //在子寫成中運行函數(shù)foo越除,并傳遞變量c
    fmt.Println("wait chan 'c' for 1 second")
    fmt.Println(<-c) //取出chan 'c'的值(取值時,如果c中無值外盯,主縣城會阻塞等待)
}
復制代碼

總結

Python和Go分別在動態(tài)語言和靜態(tài)語言中都是最易學易用的編程語言之一摘盆。

它們并不存在取代關系,而是各自在其領域發(fā)揮自己的作用饱苟。

Python的語法簡單直觀孩擂,除了程序員愛不釋手外也非常適合于其他領域從業(yè)者使用。

Go兼具語法簡單和運行高效的有點箱熬,在多線程處理方面很優(yōu)秀类垦,非常適合已經掌握一定編程基礎和一門主流語言的同學學習,不過坦弟,Go是不支持面向對象的护锤,對于大多數(shù)支持面向對象語言的使用者在學習Go語言的時候,需要謹記并且轉換編程思路酿傍。

后記

文中還有許多應該涉及的知識卻沒有能夠詳細說明烙懦,它是不完整的,甚至難免會有一些失誤赤炒。

如果氯析,您覺得本文對您有所幫助,希望能夠得到您的點贊支持莺褒,如果文中有錯誤的地方掩缓,也希望不吝賜教,通過評論或者公眾號和大家一起交流學習遵岩。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末你辣,一起剝皮案震驚了整個濱河市巡通,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舍哄,老刑警劉巖宴凉,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異表悬,居然都是意外死亡弥锄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門蟆沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籽暇,“玉大人,你說我怎么就攤上這事饭庞〗溆疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵舟山,是天一觀的道長救崔。 經常有香客問我,道長捏顺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任纬黎,我火速辦了婚禮幅骄,結果婚禮上,老公的妹妹穿的比我還像新娘本今。我一直安慰自己拆座,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布冠息。 她就那樣靜靜地躺著挪凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逛艰。 梳的紋絲不亂的頭發(fā)上躏碳,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音散怖,去河邊找鬼菇绵。 笑死,一個胖子當著我的面吹牛镇眷,可吹牛的內容都是我干的咬最。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欠动,長吁一口氣:“原來是場噩夢啊……” “哼永乌!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤翅雏,失蹤者是張志新(化名)和其女友劉穎圈驼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枚荣,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碗脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了橄妆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙伶。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖害碾,靈堂內的尸體忽然破棺而出矢劲,到底是詐尸還是另有隱情,我是刑警寧澤慌随,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布芬沉,位于F島的核電站,受9級特大地震影響阁猜,放射性物質發(fā)生泄漏丸逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一剃袍、第九天 我趴在偏房一處隱蔽的房頂上張望黄刚。 院中可真熱鬧,春花似錦民效、人聲如沸憔维。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽业扒。三九已至,卻和暖如春舒萎,著一層夾襖步出監(jiān)牢的瞬間程储,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工臂寝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虱肄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓交煞,卻偏偏與公主長得像咏窿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子素征,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容

  • Golang和Python都是目前在各自領域最流行的開發(fā)語言之一集嵌。 Golang其高效而又友好的語法萝挤,贏得了很多后...
    Frederic曉代碼閱讀 5,205評論 1 15
  • 所有的抉擇都有因為產品的需要 Go誕生于Google, 是由以下三位計算機領域的大師寫的 由于出身名門,Go在誕生...
    遠平9527閱讀 10,527評論 3 50
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔根欧,今天18年5月份再次想寫文章怜珍,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,754評論 2 9
  • 環(huán)境搭建 Golang在Mac OS上的環(huán)境配置 使用Visual Studio Code輔助Go源碼編寫 VS ...
    隕石墜滅閱讀 5,777評論 0 5
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,744評論 0 10