『No2: Go 基礎(chǔ)知識(shí)』

golang-second.png

Golang 基礎(chǔ)知識(shí)

大家好,我叫謝偉危号,是一名程序員牧愁。

剛剛工作一年,在編程領(lǐng)域是一名小兵外莲。

對(duì)于初學(xué)者猪半,或者說自學(xué)編程的人, 我非常理解他們自學(xué)的煩惱在哪里偷线。

因?yàn)槲乙彩菑淖詫W(xué)一路過來的磨确。都會(huì)經(jīng)歷這些過程, 堅(jiān)持下去就行, 相信我, 你幷不孤獨(dú).

如果你打算走編程的道路, 第一份工作一定要你喜歡, 或者說不討厭,同時(shí)又是在編程的路上. 堅(jiān)持下去, 相信我, 你幷不孤獨(dú).

怕的是你第一份工作因?yàn)檎T惑, 走了其他路, 內(nèi)心又想編程, 這種糾糾結(jié)結(jié)的狀態(tài),會(huì)讓你過的很不舒服, 焦慮, 難以成長.

我2016年算是正式開始編程。那時(shí)小大小鬧, 不正規(guī), 怎么好玩怎么來, 學(xué)了忘, 忘了學(xué)...

我自學(xué)編程的時(shí)候都是寫一些小的示例声邦。沒資源乏奥,沒途徑了解在企業(yè)里,到底需要些什么樣的技能亥曹。于是一遍遍熟悉編程語言的特性邓了。相信自學(xué)的編程的人大都是這樣, 稍微厲害點(diǎn)的,肯琢磨的, 搞幾個(gè)項(xiàng)目, 可見的項(xiàng)目出來, 就越來越熟練.

我直到畢業(yè)后,前大半年都是在學(xué)習(xí)媳瞪,慢慢的接觸一些東西骗炉。知道企業(yè)的一般開發(fā)流程是怎樣的。企業(yè)需要什么樣的技能材失,企業(yè)需要什么的技術(shù)痕鳍。

我覺得我有必要分享出來一些企業(yè)的解決方式:

  • 會(huì)用些什么
  • 開發(fā)流程是什么樣的
  • 需要什么樣的人
  • 怎么技術(shù)選型
    ...

當(dāng)然這些受限于我自己的經(jīng)驗(yàn),但還是希望對(duì)大家有啟發(fā).

我的這個(gè)專欄,主要是想在自己已經(jīng)使用 Golang 大半年寫了幾千行代碼、搞過兩個(gè)完整的項(xiàng)目之后笼呆,想更精深 Golang 這門語言的語言特性熊响。

同時(shí)我正在看《代碼大全》,有必要把一些好的編程思路注意事項(xiàng)分享出來诗赌。

這是我寫這一系列文章的初衷汗茄。

在開始之前, 我再羅嗦兩句: 1. 整體統(tǒng)一的代碼風(fēng)格非常重要 2. 剛開始就堅(jiān)持一些好的編程風(fēng)格

基礎(chǔ)知識(shí)

上一節(jié)講了 Golang 環(huán)境的搭建、項(xiàng)目的組織和包管理工具 govendor铭若。

插播一個(gè)第三方下載包的工具: gopm, 這個(gè)工具解決的問題是: go get 一般是從 github 服務(wù)器, 或者 google 服務(wù)器上下載第三方庫, 所以有時(shí)候網(wǎng)速慢,或者下載不成功.

地址: gopm

  • 下載 gopm: go get -u github.com/gpmgo/gopm

  • 再使用 gopm 下載第三方庫: gopm get -g -v ****

這一節(jié)講 Golang 的基礎(chǔ)知識(shí)洪碳。主要包括:

  • 變量
  • 常量
  • 字符串
  • 數(shù)組
  • 切片
  • Map
  • 結(jié)構(gòu)體
  • 函數(shù)
  • 方法
  • 分支
  • 循環(huán)

這些內(nèi)容的熟悉就能開始寫代碼了。

編程和寫作類似叼屠,這些基礎(chǔ)知識(shí)就相當(dāng)于寫作中的文字瞳腌。但為什么不同的人寫的代碼、文章存在很大的差異镜雨,有些人寫的好嫂侍,有些人寫的不好。

這其實(shí)是代碼的組織或者的文字的組織荚坞。

初學(xué)者往往不太注意這些:

比如:

  • 不太注意變量的命名
  • 不太注意函數(shù)的命名
  • 不太注意函數(shù)的組織方式
  • 不太注意項(xiàng)目的組織(即:代碼文件的組織)
  • 不太注意整體的布局風(fēng)格

那他們在注意什么? 注意實(shí)現(xiàn), 一定程度上實(shí)現(xiàn)能促進(jìn)初學(xué)者學(xué)習(xí)的熱情. 相信我, 這些不注意,往往到最后會(huì)成為你的阻礙.

寫代碼挑宠,最后雖然是計(jì)算機(jī)執(zhí)行,但是終歸是人的產(chǎn)品颓影,由人來閱讀各淀。

除非你對(duì)自己的編程水平很有信心,否則這些原則需要堅(jiān)持诡挂。能不抽象就不抽象碎浇。做到“望文生義”,即看到你的代碼大概就知道你想要干嘛璃俗,你的函數(shù)想要實(shí)現(xiàn)什么樣的功能南捂,你的項(xiàng)目想要實(shí)現(xiàn)什么樣的功能。

這一點(diǎn)旧找,其實(shí)之前我也不是太注意溺健。最近不是在閱讀《代碼大全》嘛。

寫一些代碼片段可能不太能感受到這些原則能有什么樣的益處钮蛛。一旦你的項(xiàng)目越來越復(fù)雜的時(shí)候鞭缭,你別頭疼。

1 變量

變量的注意事項(xiàng)有下面幾點(diǎn):

  • 命名:

原則:

  1. 見文知意
  2. 規(guī)范:Golang 中采用駝峰式標(biāo)準(zhǔn):numberOfClass
  3. 首字母大寫:外部可訪問魏颓;首字母小寫:內(nèi)部訪問
  4. 長度適中
  5. 避免使用關(guān)鍵字
var ok bool
var value string
var number int
  • 聲明及初始化

原則:

  1. 明確數(shù)據(jù)類型
  2. 少使用隱式聲明
# Better
var Name string

# No Good

Name := "xieWei"

在函數(shù)內(nèi)部可以使用 := 初始化岭辣,自動(dòng)判斷變量的類型。但是建議使用顯式聲明

  • 使用

原則:

  1. 變量聲明甸饱,靠近使用處: 即你需要使用變量就在要使用的地方聲明變量沦童,而不是提前聲明一大堆仑濒,或者遠(yuǎn)離使用變量的地方,不利于閱讀
  2. 多個(gè)變量聲明放一起
var (
  url string
  result []byte
  err error
  )

url = "http://www.baidu.com"
if result, err = http.Get(url); err!=nil{
  // do something
}

常用的布爾值變量名稱:

  • done
  • found
  • ok
  • success
  • flag

使用對(duì)仗:

  • begin/start
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down

2 常量

常量注意這幾點(diǎn):

  • 關(guān)鍵字:const

const AppName = "App"

3 字符串

  • 短的

var Help string

Help = "Thank you for Your help."

  • 長的

var HelpMessage string  

HelpMessage = `
Hello Everone:
  Welcome to here.
  Today, we will learn how to learn golang.
`

字符串常用的操作:

庫: strings

內(nèi)置庫的使用注意兩點(diǎn):

  • 函數(shù)的輸入值及類型

  • 函數(shù)的輸出值及類型

  • Contains: 判斷是否包含字符串

func Contains(s, substr string) bool
  • Count: 輸出字符串中自字符的個(gè)數(shù)
func Count(s, sep string) int
  • Index: 返回字符第一次出現(xiàn)的位置偷遗,不存在返回 -1
func Index(s, sep string) int
  • Join: 按給定的分隔符拼接一個(gè)字符串切片成字符串
func Join(a []string, sep string) string
  • LastIndex: 子串最后一次出現(xiàn)的位置
func LastIndex(s, sep string) int
  • ToLower: 將字符串全部小寫
func ToLower(s string) string
  • ToUpper: 將字符串全部大寫
func ToUpper(s string) string
  • Repeat: 重復(fù)字符串
func Repeat(s string, count int ) string
  • Replace: 替換
func Replace(s, old, new string, n int) string
  • TrimSpace: 去除字符串前後空格
func TrimSpace(s string) string
  • Split: 切割
func Split(s, sep string) []string 

4 數(shù)組

固定長度列表在Golang 里稱之為數(shù)組.

長度不固定的里稱之為切片.


var NumberList = [3]string

NumberList = [3]string{"Python", "Golang", "Java"}

  • 獲取數(shù)組長度: len
  • 獲取數(shù)組容量: cap

編程中,凡是可以使用if...else的都可以使用數(shù)組來遍歷,再對(duì)遍歷的值進(jìn)行操作.

5. 切片

相當(dāng)于不固定長的數(shù)組. 可以初始設(shè)置容量, 超過容量后,自動(dòng)擴(kuò)充.

  • len 獲取長度
  • cap 獲取容量

常用的操作:

  • slice
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }

    fmt.Print(value[1:])
}

>>> [weiWei wuWei]
  • append
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }

    value = append(value, "shenWei")
    fmt.Println(value)
}

>>> [xieWei weiWei wuWei shenWei]

  • range 操作
func main(){
    var (
        value []string
    )

    value = []string{
        "xieWei",
        "weiWei",
        "wuWei",
    }
    for index, i:= range value{
        fmt.Println(index, i)
    }
}

>>> 
0 xieWei
1 weiWei
2 wuWei

6. Map

字典: 鍵值型

  • 聲明

func mapDeclare(key string, value string)map[string]interface{}{
    var (
        body map[string]interface{}
    )
    body = make(map[string]interface{})
    body[key] = value
    return body
}

func main(){
   fmt.Println(mapDeclare("name", "xieWei"))
}

>>> map[name:xieWei]
  • 遍歷
func main(){
    var (
        body map[string]interface{}
    )
    body = make(map[string]interface{})
    body["name"] = "xiewei"
    body["age"] = 26
    body["university"] = "shanghaiUniversity"
    rangeMap(body)
}
func rangeMap(body map[string]interface{}) {
    for key, value := range body{
        fmt.Println(key, value)
    }
}

>>> 
name xiewei
age 26
university shanghaiUniversity

7. 結(jié)構(gòu)體

結(jié)構(gòu)體在 Golang 里面的作用非常大

  • 即是數(shù)據(jù)類型
  • 又可以有方法

作用相當(dāng)于其他語言的類.

  • 聲明
type MyExample struct {
    Name string
    Age int
    School string
}
func declare(){
    var (
        exampleStruct MyExample
    )
    exampleStruct.Name = "xieWei"
    exampleStruct.Age = 26
    exampleStruct.School = "shanghaiUniversity"
    fmt.Println(exampleStruct)
}

func main(){
    declare()
}

>>>
{xieWei 26 shanghaiUniversity}
  • 方法:

值傳遞 一般獲取值: func (m MyExample) GetAttrName()string
指針傳遞一般改變值: func (m *MyExample) SetAttrAge(newAge int)

type MyExample struct {
    Name string
    Age int
    School string
}
func declare() MyExample {
    var (
        example MyExample
    )
    example.Name = "xieWei"
    example.Age = 26
    example.School = "shanghaiUniversity"
    fmt.Println(example)
    return example
}

func (m MyExample) GetAttrName()string{
    return m.Name
}
func (m *MyExample) SetAttrAge(newAge int){
    m.Age = newAge
}

func main(){
    test := declare()
    fmt.Println(test.GetAttrName())
    fmt.Println(test)
    test.SetAttrAge(18)
    fmt.Println(test)
}

>>> 
{xieWei 26 shanghaiUniversity}
xieWei
{xieWei 26 shanghaiUniversity}
{xieWei 18 shanghaiUniversity}

  • 匿名字段

即隱式的引入一個(gè)結(jié)構(gòu)體的所有字段

type MyExample struct {
    Name string
    Age int
    School string
}
type OtherExample struct {
    MyExample
}


OtherExample 自動(dòng)擁有 Name, Age, School 字段

8 函數(shù)

函數(shù)分為這麼幾類:

  • 匿名函數(shù)
  • 結(jié)構(gòu)體的方法
  • 普通函數(shù)

要寫好函數(shù)注意下面幾點(diǎn):

  • 函數(shù)名稱: 見文知意
  • 參數(shù)
  • 返回值
  • 匿名函數(shù): 即沒有名稱的函數(shù), 字面意思, 一般用來處理簡單的函數(shù)

func main(){

    var NoNameFunc = func(name string) {fmt.Println(name)}
        NoNameFunc("xiewei")
}
  • 普通函數(shù)
func GetMaxNumber(number float64, other float64) float64 {
    return math.Max(number, other)
}

- func 關(guān)鍵字
- GetMaxNumber 函數(shù)名稱
- number, other 參數(shù) 類型 float64
- 返回值類型 float64

9 分支/判斷/循環(huán)

  • if 判斷
  • if ...else / switch 分支
  • for 循環(huán)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墩瞳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氏豌,更是在濱河造成了極大的恐慌喉酌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵喘,死亡現(xiàn)場離奇詭異泪电,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纪铺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門相速,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲜锚,你說我怎么就攤上這事和蚪。” “怎么了烹棉?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怯疤。 經(jīng)常有香客問我浆洗,道長,這世上最難降的妖魔是什么集峦? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任伏社,我火速辦了婚禮,結(jié)果婚禮上塔淤,老公的妹妹穿的比我還像新娘摘昌。我一直安慰自己,他們只是感情好高蜂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布聪黎。 她就那樣靜靜地躺著,像睡著了一般备恤。 火紅的嫁衣襯著肌膚如雪稿饰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天露泊,我揣著相機(jī)與錄音喉镰,去河邊找鬼。 笑死惭笑,一個(gè)胖子當(dāng)著我的面吹牛侣姆,可吹牛的內(nèi)容都是我干的生真。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捺宗,長吁一口氣:“原來是場噩夢啊……” “哼柱蟀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偿凭,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤产弹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弯囊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痰哨,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年匾嘱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斤斧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霎烙,死狀恐怖撬讽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悬垃,我是刑警寧澤游昼,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站尝蠕,受9級(jí)特大地震影響烘豌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜看彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一廊佩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靖榕,春花似錦标锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至星压,卻和暖如春瓶蝴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背租幕。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工舷手, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劲绪。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓男窟,卻偏偏與公主長得像盆赤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歉眷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)牺六,也就是一...
    悟名先生閱讀 4,148評(píng)論 0 13
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,183評(píng)論 1 44
  • 說到幸福,真是一個(gè)大話題扇住,老生常談春缕,也永遠(yuǎn)談不完的話題。雖然有時(shí)談起來很空洞艘蹋,很虛幻锄贼,但是對(duì)“幸福”這個(gè)概念的認(rèn)知...
    大杜915閱讀 174評(píng)論 0 0
  • 手持一柄百鍛精鋼劍女阀,想蕩盡這山河宅荤,結(jié)果還是止于此。 離了弦的箭浸策,撒出去的熱血冯键,又怎么能回頭。踏上征途的那一天我就立...
    品木成森閱讀 382評(píng)論 0 2