真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go與scala語(yǔ)言 scala和go語(yǔ)言

如何學(xué)好一門編程語(yǔ)言?

學(xué)好一門編程語(yǔ)言是十分不容易的,但是如果學(xué)會(huì)了,它的實(shí)用性是很強(qiáng)的,下面我為大家整理了學(xué)好一門編程語(yǔ)言的辦法,大家可以參考借鑒。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的新縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

如何學(xué)好一門編程語(yǔ)言?

一、多總結(jié)

多總結(jié)才能加深理解、增強(qiáng)記憶。舉例,Go 中有 slice、map、channal 類型,它們都可以用 make 生成實(shí)例,但 slice 和 map 還可以用以下形式初始化,也是編程規(guī)范中建議的初始化方式:

colors := map[string]string{}

slice := []int{}

但注意了,channal 則沒有這樣的語(yǔ)法:msg := chan string{}

上面兩句是生成實(shí)例,表示空集合,但下面兩句則表示實(shí)例不存在,值為 nil

var colors map[string]string

var slice []int

另外,結(jié)構(gòu)體指針 slice 還可以象下面這樣初始化,結(jié)構(gòu)體實(shí)例不用明確地指定類型(使用了類型推導(dǎo))、不用明確地取地址運(yùn)算()。

type Product struct {

name string

price float64

}

products := []*Product{{"Spanner", 3.99}, {"Wrench", 2.49}, {"Screwdriver", 1.99}}

看到?jīng)]有,如果不經(jīng)??偨Y(jié),這一圈學(xué)下來會(huì)把你整的稀里糊涂的。

二、多比較

學(xué)一門新語(yǔ)言一定要與你之前已經(jīng)熟悉的語(yǔ)言經(jīng)常作比較,找出它們的相同與不同,這樣才能加深記憶和理解,否則學(xué)完之后腦子里會(huì)一片混亂,搞不清誰(shuí)是誰(shuí)非了。

就拿數(shù)組來說吧,在 Java、Scala、Go 中定義、實(shí)例化、賦值是不一樣的。

//Java

int[] arr;//定義數(shù)組,不可以指定數(shù)組長(zhǎng)度

arr = new int[5];//創(chuàng)建數(shù)組對(duì)象(實(shí)例化),指定數(shù)組長(zhǎng)度

arr[1] = 8;//賦值

//Scala

val arr = new Array[Int](5) //數(shù)組在Scala里用的是泛型類,構(gòu)造函數(shù)參數(shù)指定數(shù)組大小

arr(1) = 8 //賦值,注意用的是括弧

//Go

arr := [5]int{} //創(chuàng)建數(shù)組,初始化5個(gè)元素都為0,注意如果不指定數(shù)組長(zhǎng)度,則是另外一種類型Slice

arr[1] = 8 //賦值

再比如 Map 在 Scala 與 Go 語(yǔ)言里定義、初始化、訪問也是不同的,作了以下比較后印象會(huì)非常深刻,把它們記下來,這樣以后使用就不會(huì)搞混了。

//Scala

val capital = Map("France" - "Paris", "Japan" - "Tokyo")

println(capital.get("France"))

//Go

capital := map[string]string{"France": "Paris", "Japan": "Tokyo"}

fmt.Println(capital["France"])

Go 同時(shí)給多個(gè)變量賦值在 Scala 里可以用模式匹配做到,如下:

//Scala(使用樣本類的模式匹配)

case class Tao(name: String, age: Int);

val Tao(myName, myAge) = Tao("taozs", 18);

println(myName)

println(myAge)

//Go

myName, myAge := "taozs", 18

fmt.Println(myName)

fmt.Println(myAge)

//Scala(使用元組的模式匹配)

val (myNumber, myString) = (123, "abe")

println(myNumber)

println(myString)

//Go

myNumber, myString := 123, "abe"

fmt.Println(myNumber)

fmt.Println(myString)

以下是 Scala 和 Go 定義和實(shí)現(xiàn)函數(shù)的區(qū)別:

//Scala

val increase: Int = Int = (x: Int) = x + 1

println(increase(8))

//Go

var increase func(int) int = func(x int) int { return x + 1 }

fmt.Println(increase(8))

除了在 Scala 和 Go 里都可以類型推導(dǎo)外,在 Scala 里還可以這樣定義函數(shù):

//Scala

val increase = (_: Int) + 1

為方便自己將來隨時(shí)查閱,可以建立下面這樣的對(duì)比表格,描述不一定要求規(guī)范,自己能看懂就行。

三、轉(zhuǎn)變思維方式,

學(xué)會(huì)用這門語(yǔ)言去思考

學(xué)會(huì)用語(yǔ)言去思考是關(guān)鍵。如果你以前是學(xué) C 的,轉(zhuǎn)學(xué) Java,你一定要改變以前面向過程的思維,學(xué)會(huì)用面向?qū)ο蟮乃季S去分析問題;以前學(xué) Java 的,轉(zhuǎn)學(xué) Scala 則要學(xué)會(huì)用函數(shù)式的編程思維解決問題。

舉一個(gè)函數(shù)式編程的例子,以下是 Java 語(yǔ)言常用的 for 循環(huán),循環(huán)變量從 1 到 10 執(zhí)行 10 次循環(huán)體:

// 命令式編程

for (int i = 1; i 10; i++) {

// 此處是循環(huán)體做10次

}

這被稱為命令式編程 (Imperative Programming),但學(xué)了 Scala 的函數(shù)式編程 (Functional Programming) 后,解決同樣的問題,我們可以換一種思維:構(gòu)建 1 到 10 的列表序列,針對(duì)列表中的`每個(gè)元素分別執(zhí)行函數(shù),如下:

//函數(shù)式編程

val autoList = (1 to 10).map(i = /*此處是函數(shù)體,針對(duì)1到10的每一個(gè)分別調(diào)用 1次*/)

已經(jīng)習(xí)慣了 Java 編程的,對(duì) Scala 的函數(shù)式編程、樣本類、模式匹配、不可變對(duì)象、隱式轉(zhuǎn)換等需要一個(gè)逐步適應(yīng)的過程,要漸漸學(xué)會(huì)用它們思考和解決問題。

再舉個(gè) Scala 與 Go 思維方式不同的例子,要實(shí)現(xiàn)對(duì)一個(gè)字符串里的每個(gè)字符加 1 的操作,Scala 里可以這樣:

"abc".map(cc = cc + 1)

"abc"是一個(gè)字符串對(duì)象,調(diào)用它的方法 map,這是純面向?qū)ο蟮乃季S,但在 Go 里就要轉(zhuǎn)變?yōu)槊嫦蜻^程的思維:

name := "abc"

second := strings.Map(func(x rune) rune {

return x + 1

}, name)

注意,這里的 strings 是包 (package),調(diào)用它的公共函數(shù) Map,被人操作的對(duì)象 name 字符串作為函數(shù)參數(shù)傳入。Go 提供的函數(shù) len、cap、append、 等其實(shí)都是面向過程的,雖然 Go 也提供有面向?qū)ο蟮闹С郑呀?jīng)習(xí)慣了面向?qū)ο缶幊痰?,剛開始學(xué) Go 語(yǔ)言需要特別留意這一點(diǎn)。

四、多看開源代碼

學(xué)一門語(yǔ)言就是學(xué)一種思維方式,如今 GitHub 上可下載的開源代碼海量級(jí),通過看別人的代碼,學(xué)習(xí)別人是如何解決問題的,養(yǎng)成用該語(yǔ)言思考的習(xí)慣,另外還能學(xué)習(xí)到一些非常有用的技巧,比如我在看一個(gè) Go 語(yǔ)言性能測(cè)試框架代碼時(shí)看到有以下寫法:

func main() {

defer profile.Start().Stop()

...

}

這個(gè)意思是指剛進(jìn)入程序時(shí)執(zhí)行 Start( ) 函數(shù),程序退出前調(diào)用 Stop( ) 函數(shù),非常好的技巧啊!可以用于需要在程序執(zhí)行前和程序完成后分別執(zhí)行一段邏輯的場(chǎng)景。再看 Start( ) 函數(shù)是怎么實(shí)現(xiàn)的:

func Start(options ...func(*Profile)) interface {

Stop()

} {

...

return prof

}

該函數(shù)返回了一個(gè)實(shí)現(xiàn)了含有 Stop( ) 函數(shù)接口的對(duì)象,如此才能在調(diào)用 Start 調(diào)用后連調(diào) Stop。

五、優(yōu)先學(xué)會(huì)使用代碼分析工具

代碼分析的工具包括靜態(tài)檢查、測(cè)試、測(cè)試覆蓋率分析、性能分析(內(nèi)存、CPU)、調(diào)試工具等,工具的價(jià)值在于它可以有效幫我們發(fā)現(xiàn)代碼問題,這在我們剛開始學(xué)一門編程語(yǔ)言時(shí)意義尤其重大。

例如,以下這句 Java 賦值語(yǔ)句估計(jì)沒有哪本教科書會(huì)告訴你有性能問題:

String sb = new String(“Hello World”);

以下這段 Java 代碼你也不一定能意識(shí)到有多線程問題:

synchronized public void send(authuserPacket pkt, Thread t, String flowNo) throws IOException

{

logger.info("start");

//連接不可用,直接拋出異常,等待接收線程連接服務(wù)器成功

if (!this.avaliable)

{

try

{

//如果連接不可用,則等待2S,然后重新檢測(cè)

Thread.sleep(2000);

}

... ...

如果我們及時(shí)用 FindBugs 工具檢查就會(huì)發(fā)現(xiàn)上面這些問題,進(jìn)而你會(huì)去分析研究為什么,如此,你對(duì)這門語(yǔ)言的了解也會(huì)越來越多。

另外,Go 語(yǔ)言自帶的 vet/test/cover/pprof/trace 都是非常有用的工具,一邊學(xué)一邊使用這些工具分析代碼,能加深對(duì)語(yǔ)言的理解。

六、多練習(xí)、多實(shí)踐

就象學(xué)自然語(yǔ)言一樣,如果只知道語(yǔ)法不去練是沒有任何效果的,只有反復(fù)地練習(xí),慢慢才能變成自己的一項(xiàng)技能。書本上的例子代碼最好能從頭到尾親自敲一遍,多運(yùn)行、多嘗試,另外再找一些題目來練習(xí),如能有機(jī)會(huì)參與項(xiàng)目開發(fā)則更好啦,勤動(dòng)手、勤實(shí)踐是最好的學(xué)習(xí)方法。

其它的方法還有:

做好筆記,把學(xué)習(xí)中遇到的關(guān)鍵點(diǎn)和自己的思考記下來,便于后面復(fù)習(xí)和對(duì)比;

復(fù)習(xí),學(xué)習(xí)一定要重復(fù)、重復(fù)、再重復(fù);

學(xué)習(xí)貴在堅(jiān)持,每天學(xué)一點(diǎn)(比如堅(jiān)持每天學(xué) 1 小時(shí)),日積月累。

scala的akka和go的goroutine有什么區(qū)別,分別更適合哪些應(yīng)用場(chǎng)景

Akka是基于線程池實(shí)現(xiàn)的actor,如果你的actor里存在長(zhǎng)時(shí)間的io阻塞導(dǎo)致線程耗盡,會(huì)使所有的actor都卡住,所以Akka是很害怕那種長(zhǎng)時(shí)間io阻塞的操作。

scala中actor是簡(jiǎn)單版本的actor實(shí)現(xiàn)

akka是另一個(gè)獨(dú)立的actor, 比scala自帶的強(qiáng)大的多, 當(dāng)然也是scala寫的

為啥Erlang 沒有像 Go,Scala 語(yǔ)言那樣崛起

為啥Erlang 沒有像 Go,Scala 語(yǔ)言那樣崛起

Scala到底是什么?在目前眾多的JVM語(yǔ)言當(dāng)中,Scala無(wú)疑是最引人注意的語(yǔ)言之一。Scala是一個(gè)靜態(tài)語(yǔ)言,更適合大型工程項(xiàng)目,Scala直接編譯成Java字節(jié)碼,性能接近Java。Scala是一個(gè)多范式的語(yǔ)言,你可以混合使用函數(shù)式和面向?qū)ο缶幊?,混合使用可變類和不變類,混合使用Actor和傳統(tǒng)的Java并發(fā)庫(kù)。

短短一個(gè)月的時(shí)間,Scala于本月沖進(jìn)了TIOBE的前五十名。一個(gè) Twitter 的開發(fā)人員說過,Scala 將會(huì)成為現(xiàn)代 Web2.0 的發(fā)起語(yǔ)言。LinkedIn 也用這種語(yǔ)言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語(yǔ)言。為什么Scala發(fā)展這么迅猛,可以獲得如此熱烈的社區(qū)支持。

我是做Java的,想學(xué)golang或Python或Scala,選哪個(gè)

如果按應(yīng)用的廣度來說,肯定是Python。如果你想調(diào)劑一下的話,隨便挑一個(gè)先開始,然后學(xué)著學(xué)著看看不喜歡就換,喜歡就繼續(xù)。本來就是為了調(diào)劑的,不用那么功利,喜歡就行了。

另外要嘗試的話,在你有編程基礎(chǔ)的前提下,可以試試這個(gè):The Python Challenge

如果你選的不是Python也沒關(guān)系,可以用別的語(yǔ)言實(shí)現(xiàn)這里的挑戰(zhàn)。這里涉及到字符串操作、文件I/O、http協(xié)議解析、正則等基本的東西,上述三個(gè)語(yǔ)言都可以實(shí)現(xiàn)。自己踩一踩坑再?zèng)Q定喜歡誰(shuí)吧。


網(wǎng)站題目:go與scala語(yǔ)言 scala和go語(yǔ)言
文章網(wǎng)址:http://weahome.cn/article/ddicgdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部