golang學習快速筆記(1)類型_騰訊新聞

2021-01-11 騰訊網

1.1 變量

Go 是靜態類型語 ,不能在運 期改變變量類型。

使 關鍵字 var 定義變量, 動初始化為零值。如果提供初始化值,可省略變量類型,由

編譯器 動推斷。

var x in tvar f float32 = 1.6 var s = "abc"

在函數內部,可 更簡略的 ":=" 式定義變量。

func main() { x := 123 // 注意檢查,是定義新局部變量,還是修改全局變量。該 式容易造成錯誤。 }

可 次定義多個變量。

var x, y, z int

var s, n = "abc", 123

var (

a int

b float32

)

func main() {

n, s := 0x1234, "Hello, World!"

println(x, s, n)

}

多變量賦值時,先計算所有相關值,然後再從左到右依次賦值。

data, i := [3]int, 0

i, data[i] = 2, 100+l

// (i = 0) -> (i = 2), (data[0] = 100)

特殊只寫變量 "_", 於忽略值佔位。

func test() (int, string) {

return 1, "abc"

}

func main() {

_, s := test()

println(s)

}

編譯器會將未使 的局部變量當做錯誤。

var s string

func main() {

i := 0

// 全局變量沒問題。

// Error: i declared and not used。(可使 "_ = i" 規避)

}

注意重新賦值與定義新同名變量的區別。

s := "abc"

println(&s)

s, y := "hello", 20

println(&s, y)

{

s, z := 1000, 30

println(&s, z)

// 重新賦值: 與前 s 在同 層次的代碼塊中,且有新的變量被定義。

// 通常函數多返回值 err 會被重複使 。

// 定義新同名變量: 不在同 層次代碼塊。

}

輸出:

0x2210230f30

0x2210230f30 20

0x2210230f18 30

1.2 常量

常量值必須是編譯期可確定的數字、字符串、布爾值。

const x, y int = 1, 2

const s = "Hello, World!"

const (

// 多常量初始化

// 類型推斷

// 常量組

a, b

c= 10, 100

bool = false

)

func main() {

const x = "xxx"

// 未使 局部常量不會引發編譯錯誤。

}

不 持 1UL、2LL 這樣的類型後綴。

在常量組中,如不提供類型和初始化值,那麼視作與上 常量相同。

const (

s= "abc"

x// x = "abc"

)

常量值還可以是 len、cap、unsafe.Sizeof 等編譯期可確定結果的函數返回值。

const (

a= "abc"

b= len(a)

c= unsafe.Sizeof(b)

)

如果常量類型 以存儲初始化值,那麼不會引發溢出錯誤。

const (

a byte = 100

// int to byte

b int= 1e20

// float64 to int, overflows

)

枚舉

關鍵字 iota 定義常量組中從 0 開始按 計數的 增枚舉值。

const (

Sunday = iota // 0

Monday // 1,通常省略後續 表達式。

Tuesday // 2

Wednesday // 3

Thursday // 4

Friday // 5

Saturday // 6

)

const (

_

KB= iota

MB

GB

TB

int64 = 1

// iota = 0

// iota = 1

// 與 KB 表達式相同,但 iota = 2

)

在同 常量組中,可以提供多個 iota,它們各 增 。

const ( A, B = iota, iota

如果 iota 增被打斷,須顯式恢復。

const ( A= iota// 0 B= "c" // 1 C= iota// c D // c,與上 相同。 E // 4,顯式恢復。注意計數包含了 C、D 兩 。 F// 5 )

可通過 定義類型來實現枚舉類型限制。

type Color int const ( Black Color = iota Red Blue ) func test(c Color) {} func main() { c := Black test(c) x := 1 test(x) // Error: cannot use x (type int) as type Color in function argument test(1) // 常量會被編譯器 動轉換。 }

1.3 基本類型

明確字類型命名, 持 Unicode, 持常 數據結構。

持 進位、 六進位,以及科學記數法。標準庫 math 定義了各數字類型取值範圍。

a, b, c, d := 071, 0x1F, 1e9, math.MinInt16

空指針值 nil, C/C++ NULL。

1.4 引 類型

引 類型包括 slice、map 和 channel。它們有複雜的內部結構,除了申請內存外,還需

要初始化相關屬性。

內置函數 new 計算類型 ,為其分配零值內存,返回指針。 make 會被編譯器翻譯

成具體的創建函數,由其分配內存和初始化成員結構,返回對象 指針。

a := []int a[1] = 10 b := make([]int, 3) b[1] = 10 c := new([]int) c[1] = 10 // 提供初始化表達式。 // makeslice // Error: invalid operation: c[1] (index of type *[]int)

1.5 類型轉換

不 持隱式類型轉換,即便是從窄向寬轉換也不 。

var b byte = 100 // var n int = b var n int = int(b) // Error: cannot use b (type byte) as type int in assignment // 顯式轉換

使 括號避免優先級錯誤。

*Point(p) (*Point)(p)

同樣不能將其他類型當 bool 值使 。

a := 100 if a { println("true") // Error: non-bool a (type int) used as if condition }

1.6 字符串

字符串是不可變值類型,內部 指針指向 UTF-8 字節數組。

默認值是空字符串 ""。

索引號訪問某字節,如 s[i]。

不能 序號獲取字節元素指針,&s[i] 法。

不可變類型, 法修改字節數組。

字節數組尾部不包含 NULL。

//runtime.h struct String { byte* intgo str; len; };

使 索引號問字符 (byte)。

s := "abc" println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63)

輸出:

true true true

使 "`" 定義不做轉義處理的原始字符串, 持跨 。

s := `a b\r\n\x00 c` println(s)

輸出:

a

b\r\n\x00

c

連接跨 字符串時,"+" 必須在上 末尾,否則導致編譯錯誤。

s := "Hello, " + "World!" s2 := "Hello, " + "World!" // Error: invalid operation: + untyped string

持 兩個索引號返回 串。 串依然指向原字節數組,僅修改了指針和 度屬性。

s := "Hello, World!" s1 := s[:5] // Hello s2 := s[7:] s3 := s[1:5] // Hello // World! // ello

單引號字符常量表 Unicode Code Point, 持 \uFFFF、\U7FFFFFFF、\xFF 格式。

對應 rune 類型,UCS-4。

func main() { fmt.Printf("%T\n", 'a') var c1, c2 rune = '\u6211', '們' println(c1 == '我', string(c2) == "\xe4\xbb\xac") }

輸出:

int32

// rune 是 int32 的別名

true true

要修改字符串,可先將其轉換成 []rune 或 []byte,完成後再轉換為 string。 論哪種轉

換,都會重新分配內存,並複製字節數組。

func main() { s := "abcd" bs := []byte(s) bs[1] = 'B' println(string(bs)) u := "電腦" us := []rune(u) us[1] = '話' println(string(us)) }

輸出:

aBcd

電話

for 循環遍歷字符串時,也有 byte 和 rune 兩種 式。

func main() fmt.Println() for _, r := range s { fmt.Printf("%c,", r) } // byte // rune }

輸出:

a,b,c, ,±,, , ,,

a,b,c,漢,字,

1.7 指針

持指針類型 *T,指針的指針 **T,以及包含包名前綴的 *.T。

默認值 nil,沒有 NULL 常量。

操作符 "&" 取變量地址,"*" 透過指針訪問 標對象。

不 持指針運算,不 持 "->" 運算符,直接 "." 訪問 標成員。

func main() var d = data var p *data p = &d fmt.Printf("%p, %v\n", p, p.a) }

輸出:

0x2101ef018, 1234

不能對指針做加減法等運算。

x := 1234 p := &x

// 直接 指針訪問 標對象成員, 須轉換。 p++ // Error: invalid operation: p += 1 (mismatched types *int and int)

可以在 unsafe.Pointer 和任意類型指針間進 轉換。

func main() { x := 0x12345678 p := unsafe.Pointer(&x) n := (*[4]byte)(p) for i := 0; i Pointer // Pointer -> *[4]byte }

輸出:

78 56 34 12

返回局部變量指針是安全的,編譯器會根據需要將其分配在 GC Heap 上。

func test() *int { x := 100 return &x // 在堆上分配 x 內存。但在內聯時,也可能直接分配在 標棧。 }

將 Pointer 轉換成 uintptr,可變相實現指針運算。

func main() { d := struct { s x string int }{"abc", 100} p := uintptr(unsafe.Pointer(&d)) p += unsafe.Offsetof(d.x) // *struct -> Pointer -> uintptr // uintptr + offset p2 := unsafe.Pointer(p) px := (*int)(p2) *px = 200 fmt.Printf("%#v\n", d) // uintptr -> Pointer // Pointer -> *int // d.x = 200 }

輸出:

struct { s string; x int }

注意:GC 把 uintptr 當成普通整數對象,它 法阻 "關聯" 對象被回收。

1.8 定義類型

可將類型分為命名和未命名兩 類。命名類型包括 bool、int、string 等, array、

slice、map 等和具體元素類型、 度等有關,屬於未命名類型。

具有相同聲明的未命名類型被視為同 類型。

具有相同基類型的指針。

具有相同元素類型和 度的 array。

具有相同元素類型的 slice。

具有相同鍵值類型的 map。

具有相同元素類型和傳送 向的 channel。

具有相同欄位序列 (欄位名、類型、標籤、順序) 的匿名 struct。

籤名相同 (參數和返回值,不包括參數名稱) 的 function。

法集相同 ( 法名、 法籤名相同,和次序 關) 的 interface。

var a struct { x int `a` } var b struct { x int `ab` } // cannot use a (type struct { x int "a" }) as type struct { x int "ab" } in assignment b = a

可 type 在全局或函數內定義新類型。

func main() { type bigint int64 var x bigint = 100 println(x) }

新類型不是原類型的別名,除擁有相同數據存儲結構外,它們之間沒有任何關係,不會持

有原類型任何信息。除 標類型是未命名類型,否則必須顯式轉換。

x := 1234 var b bigint = bigint(x) var b2 int64 = int64(b) var s myslice = []int var s2 []int = s // 必須顯式轉換,除 是常量。 // 未命名類型,隱式轉換。

test(1) // 常量會被編譯器 動轉換,AAAjiaoyuwang發送教學視頻。

相關焦點

  • 騰訊系APP助你搞定學習辦公,搞定學術論文寫作!
    本期,筆者來分享一下騰訊系學術寫作、研究辦公工具,讓你擺脫移動存儲介質,學習工作更加高效便捷。騰訊文檔騰訊文檔是一款可多人協作的在線工具,支持在線文檔、在線表格、在線幻燈片、在線PDF和收集表類型,打開網頁就能查看和編輯,雲端實時保存,可多人實時編輯文檔,權限安全可控。
  • api框架 web 最好的go_golang api框架 - CSDN
    成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創造一個。曾經我以為Python世界裡的框架已經夠多了,後來發現相比golang簡直小巫見大巫。golang提供的net/http庫已經很好了,對於http的協議的實現非常好,基於此再造框架,也不會是難事,因此生態中出現了很多框架。
  • AI足球大數據爬蟲分析(golang)
    程序採用golang開發,項目模塊化結構清晰完整,非常容易入手並進行二次開發分析. AI球探為程序全自動處理,全程無人為參與幹預足球分析預測程序. 避免了人為分析的主觀性及不穩定因素. 程序根據各大指數多維度數據,結合作者多年足球分析經驗,精雕細琢, 集天地之靈氣,汲日月之精華,歷時七七四十九天,經Bug九九八十一個,編碼而成.
  • 學習筆記的 5作用、4誤區、3分類、6要點
    筆記載體筆記的載體大致分為三種1. 本類(紙制)裝訂方式有線裝或者活頁,很多可以選擇。筆記本的尺寸也有很多類型。小到巴掌大小,大的可以達到A3版幅。便籤類(即時貼)2.APP類印象筆記,有道筆記,為知筆記,Onenote, 錘子便籤……很多這類產品。非常方便收集各種媒體類型,各種來源的信息。
  • 「python學習手冊-筆記」003.數值類型
    003.數值類型本系列文章是我個人學習《python學習手冊(第五版)》的學習筆記,其中大部分內容為該書的總結和個人理解,小部分內容為相關知識點的擴展。非商業用途轉載請註明作者和出處;商業用途請聯繫本人(gaoyang1019@hotmail.com)獲取許可。
  • R時間序列分析學習筆記(二十四)—— ARIMA建模和模擬(十六)
    ) * cos(jjs*freqs[j]))) list(frequencies=freqs, spectrum=spec)}往期回顧R時間序列分析學習筆記(一)——基本概念R時間序列分析學習筆記(二)——時間序列數據類型(一)R時間序列分析學習筆記
  • R語言筆記1:數據類型(向量、數組、矩陣、 列表和數據框)
    今天起分享一位從18年3月1號剛要從wet轉dry的學生零基礎學習筆記,供初學者學習,雖然筆記會有不系統的地方,但也正是初學者需要經歷和面對的,希望想入行的快上車,共同學習,一起成長。學習R語言,需要先安裝R語言,只需要從 https://www.r-project.org/ 下載適合你系統的最新版本軟體安裝即可。
  • 專訪騰訊雲機器學習平臺技術負責人:揭秘騰訊深度學習平臺DI-X背後...
    今天,騰訊正式發布了旗下深度學習平臺DI-X(Data Intelligence X),這是繼今年1月推出FPGA雲伺服器之後,騰訊在人工智慧領域的又一重大舉措。騰訊雲深度學習平臺DI-X誕生的背景雷鋒網:深度學習平臺項目是什麼時候開始啟動的?做DI-X的初衷是什麼?騰訊內部有一個機器學習平臺,從2015年的10月份就開始啟動了。因為公司有很多的算法工程師和數據科學家,大家做的事情都很類似,迫切需要一個這樣的平臺來承載大家的需求,在上面方便的進行各種組件,算法和模型的配置,快速的判斷模型效果,並應用到生產上。
  • go 學習筆記之解讀什麼是defer延遲函數
    懶人福音延遲函數官方文檔相關表述見 Defer statements[1]如果沒有 defer 延遲函數前,普通函數正常運行:當添加 defer 關鍵字實現延遲後,原來的 1 被推遲到 2 後面而不是之前的 1 2 順序.如果存在多個 defer 關鍵字,執行順序可想而知,越往後的越先執行,這樣才能保證按照依賴順序依次釋放資源.
  • 初一學習方法:做筆記
    做筆記是門很少有人研究的學問。會做筆記的同學可能上課時記得並不多,但很有成效。有些同學的筆記只有自己看得懂,但也很有效。相反,有的同學筆記記得很多,上課時幾乎一直在記筆記,不僅效果差,甚至會影響聽課效果。所以學會有效地做筆記對於每一個同學來說都是很重要的。   1.如何記課堂筆記?
  • 騰訊新聞極速版怎麼賺錢 騰訊新聞極速版一天可以賺多少錢
    騰訊新聞極速版是一款知名的新聞資訊閱讀軟體,騰訊新聞極速版可以通過閱讀新聞來賺錢的,騰訊新聞極速版一天可以賺多少錢呢,不少用戶可能不是很清楚,下面就和小編一起來看看吧!  騰訊新聞極速版一天可以賺多少  賺多少主要是根據個人情況。
  • 不知道筆記系統構建方式,怎麼能選到對的筆記應用?
    各種為學習建立的知識庫,生活、工作的to do list的筆記應用應運而生,而各大廠也基於內部信息構建的協作紛紛開發自己的筆記應用。筆記類應用作為典型的工具型應用,用戶一旦選擇使用,需要面臨更換軟體帶來的嚴重遷移成本,因此在選擇初期都會十分糾結。
  • 和平精英騰訊新聞盲盒有什麼獎勵 騰訊新聞盲盒獎勵一覽
    和平精英騰訊新聞盲盒有什麼獎勵?遊戲中開啟了「和平精英騰訊新聞盲盒周」活動,參與活動的玩家有機會獲得永久套裝,手辦等等,具體有什麼獎勵就跟著小編來看看吧。
  • 新聞發稿:騰訊新聞發布一篇稿件多少錢?
    藍獅問道CBO表示:新聞稿發布是指以新聞的形式傳播為企業品牌等做宣傳推廣的一種方式。多角度、多層面地詮釋企業文化、品牌內涵、產品機理、利益承諾,傳播行業資訊,引領消費時尚,指導購買決策。這種模式非常有利於引導市場消費,在較短時間內快速提升產品的知名度,塑造品牌的美譽度和公信力。
  • 騰訊新聞推出中文糾錯算法能力,從此AI拯救「手癌」不是夢
    鵝廠勘誤算法能力全透視   從今年春節後啟動,到六月份在騰訊新聞CMS系統全量上線、實現新聞各資訊品類全覆蓋,Dreamwriter的勘誤算法能力可謂歷盡了九九八十一難。
  • 費曼學習法、時間統計法、整體學習法、康奈爾筆記、思維導圖
    1、費曼學習法費曼說,要是不能把一個科學概念講得讓一個大學新生也能聽懂,那就說明我自己對這個概念也是一知半解的。費曼學習法的具體過程:選擇目標、模擬教學、查漏補缺、精簡類比。費曼學習法不只是一種學習方法,還是一種思維方式。
  • 騰訊新聞極速版更新為有味App,或聚焦視頻社交
    近日,騰訊宣布「騰訊新聞極速版」App升級為「有味」App,定位為美好生活分享平臺,為用戶提供短視頻內容服務。產品通過頻道滿足用戶主題化的興趣需求,向用戶分發感興趣的短視頻內容;同時通過打榜、關注、消息等功能,拉近創作者和用戶間的關係。
  • 馬化騰作序的《超級連接》,是騰訊智慧零售的「戰地筆記」
    至於究竟有哪些企業受益於騰訊智慧零售,又以何種方式克服不利因素實現蝶變,其中的玄機就在馬化騰、湯道生、林璟驊作序,騰訊智慧零售團隊操盤創作的新書《超級連接》之中。1、「聽見炮聲的人」才能決定零售戰爭走向瞬息萬變的零售戰場,唯有「讓聽見炮聲的人指揮戰鬥」是一成不變的真理。
  • Go語言學習筆記之字符串一
    這裡列舉一些 Go 語言的特點: 簡化問題,易於學習 內存管理,簡潔語法,易於使用 快速編譯,高效開發 高效執行 並發支持,輕鬆駕馭, 靜態類型 標準類庫,規範統一 易於部署 文檔全面 免費開源學習go語言有幾天了,今天突然想到把學的寫成筆記,記錄一下。如有不正確的請指教。
  • 學魁榜:高中生想快速提高化學成績,該怎麼學習?
    只有掌握了化學學習的方法和規律,同學們才能在高中階段在化學的空間裡自由的翱翔,那我們如何才能在高中階段儘可能快的掌握化學學習的方法及規律呢?無論你是高一高二還是高三,我們高中三年那麼拼命的去學習,都是為考上我們理想的大學,可以和我一樣學習《瘋狂600》裡面涵蓋高中學習方法和學習技巧,錯題分析,以及知識考點,快速提分必備。