天天看點

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P30 回顧,運算符和數組

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

var [30]int 長度30 int類型的數組

2021/07/11 老男孩帶你21周搞定Go語言 (二)

[30]int就代表類型

2021/07/11 老男孩帶你21周搞定Go語言 (二)

聲明變量做初始化

2021/07/11 老男孩帶你21周搞定Go語言 (二)

[…]代表用後面的初始化,讓go主機去數長度

2021/07/11 老男孩帶你21周搞定Go語言 (二)

數組周遊兩種方式,一種是長度,一種是range

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

有長度為3,每個裡面是長度2類型為string的數組,多元數組外層的可以是[…]

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

go語言裡,函數傳的是copy拷貝,傳的都是值,是以下面函數修改的是副本的值,原來的值是沒有修改的

2021/07/11 老男孩帶你21周搞定Go語言 (二)

y同樣也是拷貝值,不會去修改x

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P31 回顧 ,切片

2021/07/11 老男孩帶你21周搞定Go語言 (二)

列印一個空其實就是nil,nil在go語言裡代表沒有配置設定記憶體,沒有配置設定記憶體的切片一定要進行一個初始化操作

2021/07/11 老男孩帶你21周搞定Go語言 (二)

初始化操作,兩種

2021/07/11 老男孩帶你21周搞定Go語言 (二)

聲明切片的時候,沒有初始化,就沒有配置設定記憶體,配置設定之後就一定有記憶體位址,不是nil了。go偏底層,需要你去申請記憶體,不需要手動去釋放記憶體。

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

切片的本質是作為一個引用類型,是不能存值的,底層數組存值。

切片分三部分,指針指的是框框裡的第一個記憶體位址,第二部分長度是切片裡包含多少個元素,第三部分容量,目前底層數組能包含多少元素

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

切片不能直接比較隻能和nil比較

2021/07/11 老男孩帶你21周搞定Go語言 (二)

切片是引用類型,是以s1和s2指向了相同的地方

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

切片的擴容政策。

如果申請的容量大于原來的兩倍,那就直接擴容至新申請的容量。

如果小于1024,那麼就直接兩倍;

如果大于1024,就按照1.25倍去擴容。

具體存儲的值類型不同,擴容政策也有一定的不同

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

切片沒有初始化是不能直接使用的,append函數自動幫你擴容和初始化

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

這樣初始化,是長度為0,底層數組容量是3,copy的前提是s3有位置可以放下,現在長度是0就等于沒位置

2021/07/11 老男孩帶你21周搞定Go語言 (二)

現在就有位置了

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P32 回顧,指針

*&取位址的符号,取值的符号

2021/07/11 老男孩帶你21周搞定Go語言 (二)

*go語言的指針隻能讀不能修改,string代表字元串類型的指針

2021/07/11 老男孩帶你21周搞定Go語言 (二)

根據記憶體位址找值

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

需要申請記憶體,就沒有辦法直接通過 key找值,沒有初始化就等于nil

2021/07/11 老男孩帶你21周搞定Go語言 (二)

需要初始化

2021/07/11 老男孩帶你21周搞定Go語言 (二)

map判斷某個key是否存在,如果對應key不存在,傳回的是對應類型的value

2021/07/11 老男孩帶你21周搞定Go語言 (二)

删除key,就變成空的了

2021/07/11 老男孩帶你21周搞定Go語言 (二)

已經初始化了,就算把key都删除也不等于nil

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

P33 字元統計

可以判斷在指定的字元範圍内

2021/07/11 老男孩帶你21周搞定Go語言 (二)

下面有一個range表

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

列印出個數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

周遊有幾個日文字元

2021/07/11 老男孩帶你21周搞定Go語言 (二)

查找單詞出現的次數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

計算單詞的出現次數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

這樣就計算出了次數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P34 回文判斷

會問判斷就是一個字元串,從左往右讀和從右往左讀是一樣的

2021/07/11 老男孩帶你21周搞定Go語言 (二)

隻要周遊一半即可

2021/07/11 老男孩帶你21周搞定Go語言 (二)

但是還有問題,現在先造一個rune類型的切片,把字元串追加到切片裡,下面周遊切片即可

中文用ascii表示不了,用的utf-8的編碼,占三個位元組

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

P35 函數定義和defer

函數就是一段代碼的封裝

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

…三個點代表若幹個int類型

2021/07/11 老男孩帶你21周搞定Go語言 (二)

列印的y就是把數字放在切片裡

2021/07/11 老男孩帶你21周搞定Go語言 (二)

命名傳回值

2021/07/11 老男孩帶你21周搞定Go語言 (二)

go語言支援多個傳回值

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

go語言定義函數的時候,函數帶命名隻能放在函數外面,下面這樣是不允許的,在一個命名的函數中不能夠再聲明命名函數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

go裡的defer語句會将其後面跟随的語句進行延遲處理,在defer歸屬的函數即将傳回時,将延遲處理的語句按defer定義的逆序執行,也就是先被defer的語句最後被執行,最後被defer的語句,最先被執行。

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

加一個defer,代表defer後面的語句延遲到函數即将傳回的時候再執行

2021/07/11 老男孩帶你21周搞定Go語言 (二)

可以有多個defer語句,列印的順序就是一個盒子,先放後出,嘿嘿嘿先放進去,最後拿出來。

defer多作用再函數結束前釋放資源,檔案句柄,資料庫連結,socket

2021/07/11 老男孩帶你21周搞定Go語言 (二)

繞過函數有傳回值,就return傳回值,在函數中,return不是原子,是分成兩步的,先要把傳回值指派再去return。

如果一個函數中有defer語句,defer語句在return前,執行在傳回值指派之後

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

go語言中的return不是原子操作,在底層是分為兩步執行的:

1.傳回值指派

2.真正的ret傳回

函數中如果存在defer,namedefer執行的時機是在第一步和第二步之間

2021/07/11 老男孩帶你21周搞定Go語言 (二)

第一個是5,因為修改的是x,return的傳回值在這之前已經指派了

2021/07/11 老男孩帶你21周搞定Go語言 (二)

原來的傳回值是x,defer在x的基礎上+1,再return就是6

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數傳參代表copy副本

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P36 作用域

2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數中變量查找順序,

1,先在函數内部查找

2.找不到就在函數外面查找,一直找到全局

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數内部定義的變量無法在外部使用

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

還有if和for作用域

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

總共三種作用域,全局,函數内部,語句塊

P37 函數類型作為參數和傳回值

函數也可以作為一種類型存在

2021/07/11 老男孩帶你21周搞定Go語言 (二)

這是一個沒有參數,沒有傳回值的函數類型

2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數也是有類型區分的,a是沒有參數沒有傳回值的函數類型,b是沒有參數有傳回值的函數類型

2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數可以作為參數的類型,拿到這個函數就執行

2021/07/11 老男孩帶你21周搞定Go語言 (二)

有參數的f4就傳不進去了

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數還可以做為傳回值

2021/07/11 老男孩帶你21周搞定Go語言 (二)

傳回了一個記憶體位址

2021/07/11 老男孩帶你21周搞定Go語言 (二)

這樣就拿到函數結果了

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

P38 閉包

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

匿名函數一般用在函數内部,不是下面 一樣用在全局的

2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數内部沒有辦法申明有名字的函數,如果隻是調用一次的函數,還可以簡寫成立即執行函數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

如果匿名函數有參數,後面的括号就是調用括号,就立即執行函數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

典型應用場景,要把類型不比對的函數傳到以前的函數去執行,在f3的 基礎上,把f2傳進去,既沒有參數也沒有傳回值的東西

2021/07/11 老男孩帶你21周搞定Go語言 (二)

lixiang這個匿名函數去調用這個x

2021/07/11 老男孩帶你21周搞定Go語言 (二)

參數也可以找外面的

2021/07/11 老男孩帶你21周搞定Go語言 (二)

這樣調用就是可以把函數傳進去,100指派給m,200給n,

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P39 閉包

2021/07/11 老男孩帶你21周搞定Go語言 (二)

調用addr函數,得到一個傳回值,這個函數就是接收一個int類型參數,傳回int結果

2021/07/11 老男孩帶你21周搞定Go語言 (二)

閉包,一個函數可以引用外部的變量,ret不是一個簡單的函數,x的變量是可以引用外部的變量的。

是以閉包是一個函數,這個函數可以包含外部作用域的一個變量

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

具體應用就是下面的例子,現在要把f2當作參數傳到f1裡

2021/07/11 老男孩帶你21周搞定Go語言 (二)

底層的原理就是,

1.函數可以作為傳回值

2.函數查找變量的順序,現在自己内部找,找不到就去外層找

2021/07/11 老男孩帶你21周搞定Go語言 (二)

ret變量不僅有函數,還有x這個變量

2021/07/11 老男孩帶你21周搞定Go語言 (二)

閉包=函數+外部變量的引用,比如f1函數是别人寫的,f2函數自己寫的,想讓别人在f1裡執行f2,隻能把f2當作參數傳到f1

裡,f2裡有兩個參數,可以用第三個函數,用第三個函數接收x,y,在内部傳回一個匿名函數,匿名函數沒有參數,但是可以閉包的引用找到 x,y

2021/07/11 老男孩帶你21周搞定Go語言 (二)

匿名函數間接引用x,y,現在的結果會傳到f1

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

複雜一點,在f3裡實作調用f2

2021/07/11 老男孩帶你21周搞定Go語言 (二)

ret就是這個匿名函數

2021/07/11 老男孩帶你21周搞定Go語言 (二)

就可以把ret這個匿名函數傳到f1裡

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

ret是個func類型,就可以直接執行

2021/07/11 老男孩帶你21周搞定Go語言 (二)

執行的就是f3裡的匿名函數

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

接收一個string的參數,傳回一個函數,這個函數也有一個參數和一個傳回值

2021/07/11 老男孩帶你21周搞定Go語言 (二)

上面是加上判斷什麼結尾,不是jpg結尾的都加上jog

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

函數定義包括,關鍵字,函數名(參數),傳回值

2021/07/11 老男孩帶你21周搞定Go語言 (二)

f1是add ,f2是sub

2021/07/11 老男孩帶你21周搞定Go語言 (二)

sub和add都用了外面的base,10+1=11,11-2=9

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

假如前面的不執行,就是13,9

2021/07/11 老男孩帶你21周搞定Go語言 (二)

第一次改的是公用的base

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P40 defer再講解

defer就是一個延遲調用,就是為了釋放一些資源,defer語句有多條,先放後出

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

defer執行時機,是放在return語句中傳回值指派和真正return語句中間的位置。

2021/07/11 老男孩帶你21周搞定Go語言 (二)

這個修改的x是上面的x

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

傳一個x的指針

2021/07/11 老男孩帶你21周搞定Go語言 (二)

一塊記憶體條,上面每個位址可以用16進制表示,a取值符号取出來記憶體位址,指派給b

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

這裡執行的時候就已經指派了,把值傳進去了

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

P41 内置函數

*len可以求字元串長度(求字元串長度,求的是位元組長度,一個中文是三個位元組),數組長度,切片長度,map。

new 和make都是用來配置設定記憶體的,

make是給slice,map,channel,傳回還是slice,map,channe

new是來配置設定值類型的,基本資料類型,int,string,bool,傳回對應類型的指針 **

append是用來追加元素的數組、slice

panic和recover是用來做錯誤處理,錯誤嘗試恢複

2021/07/11 老男孩帶你21周搞定Go語言 (二)

go語言設計的時候把錯誤當作值來處理,每一個錯誤都有具體的值,不是nil就拿到這個錯誤進行操作。

2021/07/11 老男孩帶你21周搞定Go語言 (二)

panic和recover,當程式出現嚴重的錯誤的時候,崩潰了,之前打開的檔案還在占用着沒有釋放,panic和recover就是解決這樣的問題了,程式出現問題後,recover可以調用這些釋放資源

2021/07/11 老男孩帶你21周搞定Go語言 (二)

示範panic釋放資源,panic和recover是同時出現的

2021/07/11 老男孩帶你21周搞定Go語言 (二)

panic就是崩潰了,退出了

2021/07/11 老男孩帶你21周搞定Go語言 (二)

假如在panic之前連結了資料庫

2021/07/11 老男孩帶你21周搞定Go語言 (二)

recover是嘗試恢複

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

recover會拿到panic的code,進行恢複,讓程式不會崩潰退出,recover會去恢複panic狀态,但是一般不用

2021/07/11 老男孩帶你21周搞定Go語言 (二)

recover必須搭配defer使用,defer一定要在可能引發panic的語句之前定義

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P42 fmt标準庫介紹

2021/07/11 老男孩帶你21周搞定Go語言 (二)

fmt列印有三個系列,print輸入什麼列印什麼,不會換行。

printf,前面的字元串相當于占位符,格式化輸出。

println,會自動加換行。

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

占位符分幾個部分,一種是通用占位符。go語言預設輸出内容就是%v的。

%+v,類似%v,但輸出結構體時會添加字段名。

%#v ,值的GO文法表示

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

百分号%就是代表特殊的符号,用來接收某個變量。mising代表沒傳遞

2021/07/11 老男孩帶你21周搞定Go語言 (二)

兩個%号代表真的%号

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

%t 布爾型,int100不是一個字元串

2021/07/11 老男孩帶你21周搞定Go語言 (二)

%b二進制,%U表示unicode格式

2021/07/11 老男孩帶你21周搞定Go語言 (二)

65的ascii碼應該是A,%q值對應的go字元串字面值

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

字元傳加雙引号引号

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

9.2f總位數9位,小數點 留兩位

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

左對齊還是右對齊

2021/07/11 老男孩帶你21周搞定Go語言 (二)

%2.3s,代表總長度2,截取3

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

擷取使用者輸入,輸入變量并指派

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

也能拿到值

2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)
2021/07/11 老男孩帶你21周搞定Go語言 (二)

拼接

2021/07/11 老男孩帶你21周搞定Go語言 (二)

P43 homework

2021/07/11 老男孩帶你21周搞定Go語言 (二)

分金币

2021/07/11 老男孩帶你21周搞定Go語言 (二)

實作這個功能

2021/07/11 老男孩帶你21周搞定Go語言 (二)