1.區塊鍊與go
區塊鍊是一個時代的産物。涉及到很多核心詞彙,例如:
Google,肯·湯姆遜,丹尼斯·李琦,圖靈,B,C,中心化,去中心化,區塊
Google:go語言是Google公司開發的一款,快速,高效,叢集化的語言
湯姆遜:B語言+C語言的創始人之一,後去Google任職,為Go語言的創始人
丹尼斯·李琦:B語言+C語言的創始人之一
圖靈:現代計算機之父,傳奇巨匠
中心化:資訊“公證”,但存在安全風險。因為“公證”概念本身就不存在
去中心化:資訊“公開”,将所有的資訊加密後發送給每一個資訊體,
保證資訊安全不會因單一資訊體崩潰導緻資訊失效
區塊(block):其實就是一個消息體,包括:資訊體雙方,資訊内容,資訊時間等。
區塊鍊(blocks):以時間為軸,将所有的區塊連結成一個鍊條。
這個鍊條就是所有的區塊連結後的一個整體。
鍊條被所有區塊的資訊體共同擁有。
鍊條中任意一個資訊體都無權對整個鍊條做出任何操作
除非被鍊條中所有資訊體承認。
目前,實作區塊鍊的核心語言就是go語言
go語言是一個處理後端的語言
ps:linux unix兩者類似,隻不過linux開源免費,而unix正版收費,并且普遍非常貴!
2.go的第一個程式
安裝goLand(jetbrain公司的産品,類似于webstorm)
建立第一個go程式
goLand系統設定(取消預設打開上一次工程,自動換行,字型大小,背景顔色等等)
第一個go程式結構
//導入主函數的包
package main
//系統會自動導入程式所需要的包
//fmt指的是format,即标準輸入輸出的格式包
import "fmt"
//主函數,程式的主入口,整個程式有且僅能有一個main函數
func main(){
fmt.Println(a: "hello world!")
}
執行程式->run,在控制台中檢視“輸出結果”
3.注釋類型
注釋是程式在執行的時候,不進行邏輯,隻充當說明的結構
go語言中存在兩種注釋類型
(1)//單行注釋
(2)塊級注釋
4.變量
(1)引言
在程式執行過程中,其儲存的值可以發生改變的量,就稱為變量
變量存儲于記憶體中。
類似于數學概念中未知數x的概念。
ps:CE修改内容
ps:語句以分号結尾,但是可以不寫。
(2)記憶體
記憶體、記憶體位址、記憶體連續、進制數
記憶體:全程為内部存儲空間,指的是計算機的存儲容量
記憶體位址:是一個無符号十六進制整數表示的标記
記憶體連續:記憶體位址是連續的,而不能夠跳躍。
進制數:二進制、八進制、十進制、十六進制
(3)變量基本結構
變量的聲明和調用
聲明:變量聲明采用關鍵詞var
文法:var 變量名 資料類型
例子:var num int
(ps:go語言中将初始化操作稱為定義,即var num int = 10為定義了一個int類型的變量num,并指派為10)
注意:當沒有對變量進行指派操作的時候,int類型的資料預設值為0.
調用:直接寫出變量名即可調用,即fmt.Println(num)
(4)變量的資料類型
布爾類型、整型、浮點型、位元組型(byte)、字元串型等...
變量在定義時,存儲不同的資料需要不同的資料類型。不同的資料類型不能存放到相同的類型變量中
5.自動推導類型
因為每次聲明變量寫出完整的寫法過于麻煩,go語言提出了自動推導類型
即變量在聲明的時候可以不寫出變量的類型,然後通過:=符号來指令go語言來推測變量歸屬于某種類型
num:= 100;
fmt.Println(num);//100
但是需要注意的是,通過自動推導類型聲明的變量,在聲明的時候不能書寫var關鍵字。
并且對于自動推導類型來說,指派是必須的,因為go會根據所賦的值來進行類型的推導。
(1)類型轉換
在go語言中,不同的資料類型不能進行計算,但是可以通過類型轉換來解決。
num1:=100;
num2:=5.0;
fmt.Println(num1*num2);//報錯
var num1 float64 = 100;//類型轉換
num2:=5.0;
fmt.Println(num1*num2);//500
6.多重指派
當存在多個變量需要指派的時候,單獨的變量指派會顯得代碼特别臃腫
而此時go語言允許使用多重指派的方式對變量民進行指派,其文法格式為:
變量1,變量2,...:=值1,值2,...
或
var 變量1,變量2,... 類型=值1,值2,...
例如:
num1,num2,num3:=100,200,300;
或
var num1,num2,num3 int = 100,200,300;
注意:指派時前面有幾個變量,後面的值要與之一一對應。否則可能會出錯。
(1)硬碟,記憶體,中央處理器
代碼,軟體等内容初始都存放于硬碟中,
而一旦程式執行起來,那麼系統就會将軟體代碼從硬碟中取出,放入記憶體中。
當代碼資料從硬碟中取出後,程式的執行就和硬碟沒什麼關系了。
記憶體:代碼區,資料區,堆區,棧區
中央處理器:運算器,控制器,寄存器
(2)變量交換
num1,num2:=10,20;
1)第三方取值
temp:=num1;
num1=num2;
num2=temp;
2)雙方指派
num1=num1+num2;
num2=num1-num2;
num1=num1-num2;
3)go語言多重複值(go語言獨有!)
num1,num2=num2,num1;
7.格式化輸出
(1)匿名變量
變量在多重指派的時候,如果存在有不希望儲存的值,那麼這個變量就可以采用_下劃線符号存儲。
那麼這樣能夠保證變量的多重複值不會被打斷,并且這個_下劃線所代表的的變量 并不會真的對數值進行存儲。
而是存儲完畢後立即丢棄
例如:
num1,num2,_,num4 := 100,200,300,400;
fmt.Println(num1);//100
fmt.Println(num2);//200
fmt.Println(num4);//400
fmt.Println(_);//報錯!cannot use _ as value
(2)格式化輸出
在go語言中使用fmt中所提供的輸出語句來完成輸出操作,其中存在多種格式化輸出的方法
1)fmt.Println(a ...interface{}}) 本方法的參數可以是任意資料類型,并且換行輸出
2)fmt.Print(a ...interface{}) 本方法的參數與Println相同,但是是單行輸出
3)fmt.Printf(format string, a ...interface{})
eg:
num1:=10;
num2:=3.1415;
fmt.Printf("%d\n%f",num1,num2);
ps:\n在格式化輸出語句中,表示轉義字元,相當于是一個換行符号。
ps:fmt.Printf("%3d",num1);// 10,表示有3位有效數字,但是若num1位數超過了3位,則原封不動輸出而不會四舍五入
fmt.Printf("%-3d",num1);//10 ,表示3位有效數字
fmt.Printf("%05d",num1);//00010,表示5位有效數字
fmt.Printf("%-05d",num1);//10 ,表示5位有效數字,注意此情況下0補位操作不生效!
ps:%f預設保留6位有效數字
如果有需要,可以通過%4f這樣的操作來決定保留多少位小數
fmt.Printf("%.3f",num2);//3.142,表示小數點後保留3位
(3)格式化輸出類型
%d -- 整數類型int
%f -- 浮點數類型float
%t -- 布爾值類型bool
%s -- 字元串類型string
%c -- 字元類型byte
%p -- 記憶體位址類型memory
ps:如果通過fmt.Println方法去對byte位元組類型的變量直接輸出的時候,并不能夠直接輸出字元本身
而是會輸出字元所對應的ASCII編碼值,隻有通過%c格式化輸出才能達到輸出字元的目的。
(0=>48 a=>97 A=>65)
8.格式化輸入
(1)fmt.Scan()格式化輸入函數
go語言中使用Scan函數來進行格式化輸入,其文法為fmt.Scan(*p)。
也就是說其參數需要是一個變量的記憶體位址
eg:var num int;
fmt.Scan(&num);
fmt.Println(num*100);
此時使用者在控制台中輸入一個數字,例如45,則會在控制台中輸出4500.
ps:若輸入的資料類型和變量的資料類型不符合,則會接收資料一直到非符合資料類型截止。
eg:輸入 123abc, 輸出 12300
輸入 123.45, 輸出 12300
ps:格式化函數中,空格space和回車enter是作為接收結束的标志。
是以在輸入的過程中若出現了空格或回車的字樣,那麼scan函數就接收中斷了。
是以可以通過連續的scan來實作多個輸入内容的擷取
eg:fmt.Scan(&str1,&str2,...);
(2)fmt.Scanf()格式化輸入函數
go語言中也允許使用c語言經典風格的scanf函數來進行格式化輸入。其文法與c語言中的scanf并無任何差別
eg:
var num int;
var str string;
fmt.Println("here please input a int Number and a string\n please use space between them and end with enter: ");
fmt.Scanf("%d,%s", &num, &str);
fmt.Printf("input int Number is %d\n", num);
fmt.Printf("input string is %s", str);
ps:go語言中scanf函數内要求強格式輸入,是以如果scanf函數中如下寫法,
那麼就必須将内容原封不動按照scanf格式書寫才能正确擷取,但是由于存在空格的原因,還有可能會擷取失敗!
eg:
fmt.Scanf("here please input a int Number and a string\n please use space between them and end with enter: %d,%s", &num, &str);
here please input a int Number and a string\n please use space between them and end with enter: 100,helloWorld!
(這簡直蠢到爆炸!)
ps:%s可以無限長度的擷取使用者輸入的内容,而%nX可以決定擷取n個X類型的字元
eg:
fmt.Scanf("%3d,%s",&num,&str);
123,helloEveryoneHere//123,helloEvenyoneHere
fmt.Scanf("%3d%s",&num,&str);
12345helloEvenyoneHere//123,45helloEvenyoneHere
9.變量命名規則
go語言中的命名規則為
1)采用數字,字母,下劃線構成
2)不得已數字開頭
3)采用大小寫敏感
4)不得采用系統關鍵字或預定義名稱命名(例如:break,for,continue,int..)
5)采用駝峰命名法(windows命名習慣)
eg:studentName victorUserName
下劃線命名規範(linux命名規範)
eg:class_id user_password
10.基礎資料類型
go語言中資料類型有:
整數類型int 預設值是0
浮點數類型float 預設值是0
字元類型byte 預設值是''
字元串類型string 預設值是"\0"空字元串
布爾值類型bool 預設值是false假值
其中int分為int和uint,又可以細分為:int8 int16 int32 int64 uint8 uint16 uint32 uint64
其中float分為:float32(精确到7位) float64(精确到15位)
ps:布爾值不能夠用數字0,1代表true或者false的真假值
ps:byte位元組類型是uint8類型的别名
ps:資料的存儲可以分成幾個部分
整數:【符号位】【數字位】
浮點數:【符号位】【整數位】【浮點數位】
ps:浮點數精度不夠的時候,會在最後一位精度的位置進行四舍五入
3.1415926535 => 在float32情況下 => 3.1415927
ps:byte字元型采用''單引号定義,而string字元串類型采用""雙引号定義。不能混淆!
ps:\0轉義字元,表示字元串結束辨別
ps:字元串相加文法是允許的,其結果為字元串的拼接
var str1 string= 'hello';
var str2 string= ' world!';
str3 := str1+str2;//hello world!