go語言核心詳解

2021-08-22 15:14:49 字數 3575 閱讀 4514

知道了不行,熟悉也不夠,要真正進入潛意識,成為條件反射才行!

多讀書,多看報,少吃零食,多睡覺。

golang基本語法中比較有含金量的技能點 1、鎖 2、反射 3、併發程式設計

var宣告變數 自動推導可以定義區域性變數

go語言和python語言一樣支援多返回值,也就是說函式可以一次性返回多個值,這和其他語言有著顯著的不同。

go語言中陣列是值傳遞,這和其他的語言有著很大的不同,切片是引用傳遞。

go 是靜態型別語⾔,不能在運⾏期改變變數型別。使⽤關鍵字 var 定義變數,⾃動初始化為零值。如果提供初始化值,可省略變數型別,由

編譯器⾃動推斷。

var x int

var f float32 = 1.6

var s = "abc"

在函式內部,可⽤更簡略的 「:=」 ⽅式定義變數。

func main() 

可⼀次定義多個變數。

var x, y, z int

var s, n = "abc", 123

var (

a int

b float32 )

func main()

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

data, i := [3]int, 0

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

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

特殊只寫變數 「_」,⽤於忽略值佔位。

func test() (int, string) 

func main()

編譯器會將未使⽤的區域性變數當做錯誤。

var s string

func main()

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

引⽤型別

引⽤型別包括 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)

型別轉換

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

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)

<-chan int(c)

(<-chan int)(c)

// 相當於 *(point(p))

// 相當於 <-(chan int(c))

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

a := 100

if a

字串

字串是不可變值型別,內部⽤指標指向 utf-8 位元組陣列。

• 預設值是空字串 「」。

• ⽤索引號訪問某位元組,如 s[i]。

• 不能⽤序號獲取位元組元素指標,&s[i] ⾮法。

• 不可變型別,⽆法修改位元組陣列。

• 位元組陣列尾部不包含 null。

struct string

;

使⽤索引號問字元 (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

golang中http的函式原型

func handlefunc(pattern string, handler func(responsewriter, *request)) 

func listenandserve(addr string, handler handler) error

tcp函式原型

服務端

func listen(network, address string) (listener, error)  

listener.accept() accept() (conn, error)

客戶端

func dial(network, address string) (conn, error) 

write(b byte) (n int, err error)

獲取到conn後就可以從中進行讀寫

簡單tcp伺服器

package main

import (

"net"

"fmt"

"io"

)func main()

defer listener.close()

i:=1

for ; ;

go func()

if err2==io.eof

i++fmt.println("**********",i,"**********=")

fmt.println(string(buf[:n]))

}}()

}}

go語言核心程式設計 Go 語言核心檔案除錯

程式除錯對於檢查和理解程式執行過程和狀態是非常有用的。乙個核心轉儲檔案 core dump file 中包含程式程序執行時的記憶體資訊和程序狀態。它主要用於程式的問題除錯,以及在執行過程中理解程式的狀態。這些對於我們診斷程式問題原因和分析生產環境中的服務問題有非常大的幫助。在本文中,我會用乙個非常簡...

Go語言核心 slice切片

slice是長度可變的元素序列 陣列不可變 每個元素都有相同的型別。slice型別寫作t,其中t代表slice中的元素型別 slice和陣列寫法很像,只是沒有指定長度。陣列和slice之間的聯絡非常緊密。slice是非常輕量的資料結構,它是引用型別,指向底層的乙個陣列,該陣列被稱之為slice的底層...

Go語言介面詳解

介面在go語言有著至關重要的地位。介面是go語言這個型別系統的基石,讓go語言在基礎程式設計哲學的探索上達到了前所未有的高度。介面解除了型別依賴,有助於減少使用者的可視方法,遮蔽了內部結構和實現細節。但是介面實現機制會有執行期開銷,也不能濫用介面。相對於包,或者不會頻繁變化的內部模組之間,不需要抽象...