Golang 特性簡介

by sheepbao

主要大概介紹go語言的歷史和特性,簡單的入門。

來歷

很久以前,有一個IT公司,這公司有個傳統,允許員工擁有20%自由時間來開發實驗性項目。在2007的某一天,公司的幾個大牛,正在用c++開發一些比較繁瑣但是核心的工作,主要包括龐大的分布式集群,大牛覺得很鬧心,后來c++委員會來他們公司演講,說c++將要添加大概35種新特性。這幾個大牛的其中一個人,名為:Rob Pike,聽后心中一萬個xxx飄過,“c++特性還不夠多嗎?簡化c++應該更有成就感吧”。于是乎,Rob Pike和其他幾個大牛討論了一下,怎么解決這個問題,過了一會,Rob Pike說要不我們自己搞個語言吧,名字叫“go”,非常簡短,容易拼寫。其他幾位大牛就說好啊,然后他們找了塊白板,在上面寫下希望能有哪些功能(詳見文尾)。接下來的時間里,大牛們開心的討論設計這門語言的特性,經過漫長的歲月,他們決定,以c語言為原型,以及借鑒其他語言的一些特性,來解放程序員,解放自己,然后在2009年,go語言誕生。

思想

Less can be more

大道至簡,小而蘊真

讓事情變得復雜很容易,讓事情變得簡單才難

深刻的工程文化

優點

  1. 自帶gc。
  2. 靜態編譯,編譯好后,扔服務器直接運行。
  3. 簡單的思想,沒有繼承,多態,類等。
  4. 豐富的庫和詳細的開發文檔。
  5. 語法層支持并發,和擁有同步并發的channel類型,使并發開發變得非常方便。
  6. 簡潔的語法,提高開發效率,同時提高代碼的閱讀性和可維護性。
  7. 超級簡單的交叉編譯,僅需更改環境變量。(花了我兩天時間編譯一個imagemagick到arm平臺)
  8. 內含完善、全面的軟件工程工具。Go語言自帶的命令和工具相當地強大。通過它們,我們可以很輕松地完成Go語言程序的獲取、編譯、測試、安裝、運行、運行分析等一系列工作,這幾乎涉及了開發和維護一個軟件的所有環節。

hello

package mainfunc main() {println("hello, sewise")
}

type

主要講講特有的類型,其他基本類型不做介紹

slice

切片:可以理解為動態數組,類似c++的vector 聲明一個slice

 var slice []T// 如:var ints []int

slice的追加

ints = append(ints, 1)
ints = append(ints, 2, 3, 4, 5)

slice的截取

newInts1 := ints[2:3]
newInts2 := ints[2:]
newInts3 := ints[:4]

map

字典:鍵值對

var json map[string]string

interface

接口:方法的集合,是一種合約 栗子: 聲明一個bird接口

var bird interface {fly()
}

聲明一個hen對象(實現bird接口)

type hen struct {weight inthasFeather bool
}func (h hen) fly() {fmt.Println("iI can fly")
}func (h hen) eat() {h.weight++fmt.Println("yes, I can eat")
}

聲明一個 pig 對象(未實現 bird 接口,因為 pig 不會 fly)

type pig struct {age intweignt inthasFeather bool
}func (p pig) run() {fmt.Println("I can run")
}func (p pig) eat() {p.weight += 100fmt.Println("Yes, I can eat so much")
}func (p pig)sleep(){fmt.Println("I slept all my life")
}// pig can't fly

channel

通道:輕量集隊列,傳遞某種類型的值的通道

var ch chan int
ch = make(chan int, 1)

往ch寫入一個數據

ch<- 8888

從ch讀取數據

out := <-ch

特性: channel是有長度的,當channel的緩沖為滿時,再往里寫入就會阻塞,當channel的緩沖為空時,從channel讀就會阻塞

package mainimport ("fmt""time"
)func main() {ch := make(chan int)fmt.Println("ch len:", len(ch))go func() {// 往緩沖滿的channel里寫數據(阻塞)// ch <- 1// 從緩沖為空的channel里讀數據(阻塞)<-chfmt.Println("I am in minor goroutine")}()fmt.Println("I am in main goroutine")time.Sleep(2 * time.Second)
}

當長度為 0 是,就是不帶緩沖的 channel 長度大于0,就是帶緩沖的 channel

并發

關鍵字:go?啟動 go 程 一個普通的函數或方法調用前加上關鍵字 go,即可啟動一個 goroutine

go func() {fmt.Println("start func")time.Sleep(120*time.Second)
}()

競爭條件檢測?-race?race.go

package mainimport ("fmt""time"
)func main() {a := 1go func() {a = 2}()a = 3fmt.Println("a is ", a)time.Sleep(2 * time.Second)
}

檢測:執行go run -race race.go

a is  3
==================
WARNING: DATA RACE
Write at 0x00c420072188 by goroutine 6:main.main.func1()/Users/bao/program/go/gowork/hello/src/research/race.go:11 +0x3bPrevious write at 0x00c420072188 by main goroutine:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:13 +0x9fGoroutine 6 (running) created at:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:12 +0x8e
==================
Found 1 data race(s)

結果分析: goroutine6運行到第11行和main goroutine運行到13行的時候觸發競爭了。而且goroutine6是在第12行的時候產生的。

package

包的管理,關鍵字import,GOPATH

gopath

gopath是一個路徑列表,存放go項目工程?GOPATH文件目錄結構

├── bin  二進制文件目錄
├── pkg  編譯好的庫文件目錄
└── src  源碼目錄  

平常項目的目錄結構

├── bin  二進制文件目錄
├── pkg  編譯好的庫文件目錄
└── src  源碼目錄├── main  入口函數目錄└── vendor  當前項目的庫目錄└── sheepbao.com└── glog

import

比如上面的項目,我要在main.go引入glog包

package main// 引入glog包
import "sheepbao.com/glog"func main() {glog.Println("test")
}

go的工程工具簡介

test

go的命令工具?test,用來做測試

單元測試

go test?只測試函數名被它正確匹配的測試函數?go test -v -run="French|Canal"

栗子: add.go

package testfunc addOne(i int) int {return i + 1
}

add_test.go

package testimport "testing"func TestAddOne(t *testing.T) {result := addOne(1)if result != 2 {t.Error("1+1!=2")}
}
bao@baoMac test$ go test -v .
=== RUN   TestAddOne
--- PASS: TestAddOne (0.00s)
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/test   0.006s

基準測試

go test -bench=.?內存的分配情況?go test -bench=FuncName -benchmem?栗子: stringsCon.go

package benchimport ("fmt"
)func Sprintf(s1, s2, s3 string) string {return fmt.Sprintf("%s%s%s", s1, s2, s3)
}func AddString(s1, s2, s3 string) string {return s1 + s2 + s3
}

stringCon_test.go

package benchimport "testing"var (s1 = "make it run!"s2 = "make it right!"s3 = "make it fast!"
)func BenchmarkSprintf(b *testing.B) {for i := 0; i < b.N; i++ {Sprintf(s1, s2, s3)}
}func BenchmarkAddString(b *testing.B) {for i := 0; i < b.N; i++ {AddString(s1, s2, s3)}
}

go test -bench=.

bao@baoMac bench$ go test -bench=.
testing: warning: no tests to run
BenchmarkSprintf-4       5000000               349 ns/op
BenchmarkAddString-4    20000000                61.7 ns/op
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/bench  3.414s

樣本測試

package etimport ("fmt"
)func ExampleHello() {fmt.Println("hello, sewise")// Output: hello, sewise
}
bao@baoMac example$ go  test -v .
=== RUN   ExampleHello
--- PASS: ExampleHello (0.00s)
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/example        0.006s

如果把上面的// Output: hello, sewise改為// Output: hello, sewis?則樣本測試不能通過

bao@baoMac example$ go  test -v .
=== RUN   ExampleHello
--- FAIL: ExampleHello (0.00s)
got:
hello, sewise
want:
hello, sewis
FAIL
exit status 1
FAIL    _/Users/bao/program/go/gowork/hello/src/research/example        0.006s

pprof

go的命令工具?pprof,用來性能分析(內存使用,泄露和cpu消耗) go tool pprof

  • 查看cpu使用:?go tool pprof?http://localhost:8089/debug/pprof/profile?終端查看:

可視化(原是svg文件,下圖為截圖):

  • 查看內存使用?go tool pprof?http://localhost:8089/debug/pprof/heap?終端查看:?

可視化(原是 svg 文件,下圖為截圖:

go tool pprof --text?http://localhost:6060/debug/pprof/heap

go命令教程

資料

http://www.csdn.net/article/2012-07-04/2807113-less-is-exponentially-more

http://www.jianshu.com/p/91e40c3e3acb?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

http://smallsoho.com/2016/11/20/Go簡明教程.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

大牛真身

最大牌的當屬B和C語言設計者、Unix和Plan 9創始人、1983年圖靈獎獲得者Ken Thompson,這份名單中還包括了Unix核心成員Rob Pike(go語言之父)、java HotSpot虛擬機和js v8引擎的開發者Robert Griesemer、Memcached作者Brad Fitzpatrick,等等。

功能

  • 規范的語法(不需要符號表來解析)
  • 垃圾回收(獨有)
  • 無頭文件
  • 明確的依賴
  • 無循環依賴
  • 常量只能是數字
  • int和int32是兩種類型
  • 字母大小寫設置可見性(letter case sets visibility)
  • 任何類型(type)都有方法(不是類型)
  • 沒有子類型繼承(不是子類)
  • 包級別初始化以及明確的初始化順序
  • 文件被編譯到一個包里
  • 包package-level globals presented in any order
  • 沒有數值類型轉換(常量起輔助作用)
  • 接口隱式實現(沒有“implement”聲明)
  • 嵌入(不會提升到超類)
  • 方法按照函數聲明(沒有特別的位置要求)
  • 方法即函數
  • 接口只有方法(沒有數據)
  • 方法通過名字匹配(而非類型)
  • 沒有構造函數和析構函數
  • postincrement(如++i)是狀態,不是表達式
  • 沒有preincrement(i++)和predecrement
  • 賦值不是表達式
  • 明確賦值和函數調用中的計算順序(沒有“sequence point”)
  • 沒有指針運算
  • 內存一直以零值初始化
  • 局部變量取值合法
  • 方法中沒有“this”
  • 分段的堆棧
  • 沒有靜態和其它類型的注釋
  • 沒有模板
  • 內建string、slice和map
  • 數組邊界檢查

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457248.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML實體字符轉化為HTML標簽

html_entity_decode方法 參數描述string必需。規定要解碼的字符串。flags 可選。規定如何處理引號以及使用哪種文檔類型。 可用的引號類型&#xff1a; ENT_COMPAT - 默認。僅解碼雙引號。ENT_QUOTES - 解碼雙引號和單引號。ENT_NOQUOTES - 不解碼任何引號。規定所使用文檔類型…

華為2017java筆試題_2017年java華為面試題

2017年java華為面試題通過HCNP認證&#xff0c;將證明您對中小型網絡有全面深入的了解&#xff0c;掌握中小型網絡的通用技術&#xff0c;并具備獨立設計中小型網絡以及使用華為路由交換設備實施設計的能力。下面是小編收集的關于java華為面試題&#xff0c;希望大家認真閱讀!1…

Tomcat 配置詳解/優化方案

Server.xml 【原地址&#xff1a;http://blog.csdn.net/cicada688/article/details/14451541】 Server.xml配置文件用于對整個容器進行相關的配置。 <Server>元素&#xff1a;是整個配置文件的根元素。表示整個Catalina容器。 屬性&#xff1a;className&#xff1a;實現…

MySQL創建數據庫與創建用戶以及授權

1、create schema [數據庫名稱] default character set utf8 collate utf8_general_ci;--創建數據庫 采用create schema和create database創建數據庫的效果一樣。 2、create user [用戶名稱]% identified by [用戶密碼];--創建用戶 密碼8位以上&#xff0c;包括&#xff1a;大寫…

java 防止url重復請求_Web項目如何防止客戶端重復發送請求

在Web項目中&#xff0c;有一些請求或操作會對數據產生影響(比如新增、刪除、更新)&#xff0c;針對這類請求一般都需要做一些保護&#xff0c;以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。本文總結了一些防止客戶端重復發送請求的方法。方法一&#xff1a;JS監聽…

【bzoj1010-toy】斜率優化入門模板

dsy1010: [HNOI2008]玩具裝箱 【題目描述】 有n個數&#xff0c;分成連續的若干段&#xff0c;每段&#xff08;假設從第j個到第i個組成一段&#xff09;的分數為 (X-L)^2&#xff0c;X為j-iSigma(Ck) i<k<j&#xff0c;其中L是一個常量。目標&#xff1a;各段分數的總和…

itellyou操作系統,office等軟件的很全的下載站

itellyou操作系統&#xff0c;office等軟件的很全的下載站http://www.itellyou.cn/轉載于:https://blog.51cto.com/wangheyu1/1894724

矩陣的馬鞍點

#include<stdio.h>#define n 4//馬鞍點是第I行值最小第J列值最大 void maxmin(int a[n][n]){ int i,j ,flag; int max[n],min[n]; for(i0;i<n;i) { min[i]a[i][0];//將數組每行的第一個元素賦值給min[]數組 for(j1;j<n;j) { if(a[i][j]<min[i]) min[i]a[i][j];…

Linux運維工程師面試-部分題庫

一、Linux操作系統知識 1.常見的Linux發行版本都有什么&#xff1f;你最擅長哪一個&#xff1f;它的官網網站是什么&#xff1f;說明你擅長哪一塊&#xff1f; 2.Linux開機啟動流程詳細步驟是什么&#xff1f;系統安裝完&#xff0c;忘記密碼如何破解&#xff1f; 3.企業中Linu…

java統計系統線程數_Java并發(八)計算線程池最佳線程數

目錄一、理論分析二、實際應用為了加快程序處理速度&#xff0c;我們會將問題分解成若干個并發執行的任務。并且創建線程池&#xff0c;將任務委派給線程池中的線程&#xff0c;以便使它們可以并發地執行。在高并發的情況下采用線程池&#xff0c;可以有效降低線程創建釋放的時…

php大小寫轉換函數

1.將字符串轉換成小寫 strtolower(): 該函數將傳入的字符串參數所有的字符都轉換成小寫,并以小定形式放回這個字 符串.例: <?php$str "I want To FLY";$str strtolower($str);echo $str; ?>輸出結果: i want to fly 2.將字符轉成大寫 strtoupper(): 該…

關于移動端 1px 像素問題

移動端1px變粗的原因 移動端html的header總會有一句<meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno">這句話定義了本頁面的viewport的寬度為設備寬度,初始縮放值和最大縮放值都為1,并禁止了…

java框架概念_java概念(2)

java概念(2)重載和重寫重載&#xff1a;同一個類中&#xff0c;方法名相同&#xff0c;參數不同重寫&#xff1a;父子類中&#xff0c;子類重新定義父類的方法多態? 多態&#xff1a;同一種行為&#xff0c;不同的對象有不同的表現形式。? 重載 編譯時根據參數決定調用的方法…

CentOS(八)--crontab命令的使用方法

crontab命令常見于Unix和Linux的操作系統之中&#xff0c;用于設置周期性被執行的指令。該命令從標準輸入設備讀取指令&#xff0c;并將其存放于"crontab"文件中&#xff0c;以供之后讀取和執行。 在Linux系統中&#xff0c;Linux任務調度的工作主要分為以下兩類&…

有健忘癥嗎?

今天興高采烈&#xff0c;早上空氣不錯&#xff0c; 但是騎自行車的我&#xff0c;還是得戴一個面罩。 半個小時后買了早餐&#xff0c; 一份炒粉、一豆漿&#xff0c;今天早上豆漿沒有掉地上&#xff0c; 但是~~~~~~~~~~~~~~shit~~!~!~,居然忘記帶要換的衣服了&#xff0c; …

下載java后綴的文件閃退_關于jarfile 打開閃退問題

后面才發現&#xff0c;原來是因為我把文件拖入了新建的文件夾&#xff0c;改變了路徑&#xff0c;而且我的java環境沒有配置好是全局變量&#xff0c;所以新建文件夾之后&#xff0c;就會出現找不到了路徑&#xff0c;閃退的問題&#xff0c;&#xff0c;&#xff0c;還有就是…

心理學資源整理

http://blog.sina.com.cn/s/articlelist_1227187337_0_1.html 功夫 轉載2016-06-07 15:53:55中華大地的武學&#xff0c;奧妙精深。但從大的方面來說&#xff0c;可分為內外軟硬&#xff0c;有形無形的區別。注重于外&#xff0c;修煉筋骨皮肉的是有形的功夫&#xff1b;注重于…

[已解決]Vistual Stdio 2015 installer Bootstrapper Packages 路徑

VS2015 installer 的預裝包的地址變更成 C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages 參看文檔&#xff1a;https://msdn.microsoft.com/en-us/library/ms165429(vvs.140).aspx 之前的版本是在 C:\Program Files (x86)\Microsoft SDKs\Win…

java怎樣寫入五個人的成績_用java輸入5個學員姓名和分數,顯示分數最高的學員姓名和分數?...

展開全部import java.util.Scanner;public class Student {private String stuname "";private float stuscore 0;public String getStuname() {e69da5e6ba9062616964757a686964616f31333335316633return stuname;}public void setStuname(String stuname) {this.s…