import "workname/packetfolder"
站在用戶的角度思考問題,與客戶深入溝通,找到華州網站設計與華州網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:做網站、網站建設、企業官網、英文網站、手機端網站、網站推廣、申請域名、網頁空間、企業郵箱。業務覆蓋華州地區。
導入多個包
方法調用 包名.函數//不是函數或結構體所處文件或文件夾名
packagename.Func()
前面加個點表示省略調用,那么調用該模塊里面的函數,可以不用寫模塊名稱了:
當導入一個包時,該包下的文件里所有init()函數都會被執行,然而,有些時候我們并不需要把整個包都導入進來,僅僅是是希望它執行init()函數而已。下劃線的作用僅僅是為了調用init()函數,所以無法通過包名來調用包中的其他函數
import _ package
變量聲明必須要使用否則會報錯。
全局變量運行聲明但不使用。
func 函數名 (參數1,參數2,...) (返回值a 類型a, 返回值b 類型b,...)
func 函數名 (參數1,參數2,...) (返回值類型1, 返回值類型2,...)
func (this *結構體名) 函數名(參數 string) (返回值類型1, 返回值類型2){}
使用大小來區分函數可見性
大寫是public類型
小寫是private類型
func prifunc int{}
func pubfunc int{}
聲明靜態變量
const value int
定義變量
var value int
聲明一般類型、接口和結構體
聲明函數
func function () int{}
go里面所有的空值對應如下
通道類型
內建函數 new 用來分配內存,它的第一個參數是一個類型,不是一個值,它的返回值是一個指向新分配類型零值的指針
func new(Type) *Type
[這位博主有非常詳細的分析]
Go 語言支持并發,我們只需要通過 go 關鍵字來開啟 goroutine 即可。
goroutine 是輕量級線程,goroutine 的調度是由 Golang 運行時進行管理的。
同一個程序中的所有 goroutine 共享同一個地址空間。
語法格式如下:
通道(channel)是用來傳遞數據的一個數據結構。
通道的聲明
通道可用于兩個 goroutine 之間通過傳遞一個指定類型的值來同步運行和通訊。操作符 - 用于指定通道的方向,發送或接收。如果未指定方向,則為雙向通道。
[這里有比較詳細的用例]
go里面的空接口可以指代任何類型(無論是變量還是函數)
聲明空接口
go里面的的強制類型轉換語法為:
int(data)
如果是接口類型的強制轉成其他類型的語法為:
go里面的強制轉換是將值復制過去,所以在數據量的時候有比較高的運行代價
作為C語言家族的一員,go和c一樣也支持結構體。可以類比于java的一個POJO。
在學習定義結構體之前,先學習下定義一個新類型。
新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。
這里要引入一個底層類型的概念。
如果一個新類型是基于某個 Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型
在上面的例子中,int就是T1的底層類型。
但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int
底層類型是很重要的,因為對兩個變量進行顯式的類型轉換,只有底層類型相同的變量間才能相互轉換。底層類型是判斷兩個類型本質上是否相同的根本。
這種類型定義方式通常用在 項目的漸進式重構,還有對已有包的二次封裝方面
類型別名表示新類型和原類型完全等價,實際上就是同一種類型。只不過名字不同而已。
一般我們都是定義一個有名的結構體。
字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。
還有一個點提一下
如果換行來寫
Age: 66,后面這個都好不能省略
還有一個點,觀察e3的賦值
new返回的是一個指針。然后指針可以直接點號賦值。這說明go默認進行了取值操作
e3.Age 等價于 (*e3).Age
如上定義了一個空的結構體Empty。打印了元素e的內存大小是0。
有什么用呢?
基于空結構體類型內存零開銷這樣的特性,我們在日常 Go 開發中會經常使用空 結構體類型元素,作為一種“事件”信息進行 Goroutine 之間的通信
這種以空結構體為元素類建立的 channel,是目前能實現的、內存占用最小的 Goroutine 間通信方式。
這種形式需要說的是幾個語法糖。
語法糖1:
對于結構體字段,可以省略字段名,只寫結構體名。默認字段名就是結構體名
這種方式稱為 嵌入字段
語法糖2:
如果是以嵌入字段形式寫的結構體
可以省略嵌入的Reader字段,而直接訪問ReaderName
此時book是一個各個屬性全是對應類型零值的一個實例。不是nil。這種情況在Go中稱為零值可用。不像java會導致npe
結構體定義時可以在字段后面追加標簽說明。
tag的格式為反單引號
tag的作用是可以使用[反射]來檢視字段的標簽信息。
具體的作用還要看使用的場景。
比如這里的tag是為了幫助 encoding/json 標準包在解析對象時可以利用的規則。比如omitempty表示該字段沒有值就不打印出來。
1、new 的主要特性
首先 new 是內建函數,定義也很簡單:
func new(Type) *Type
內建函數 new 用來分配內存,第一個參數是一個類型,不是一個值,返回值是一個指向新分配類型零值的指針
實現一個類似 new 的功能:
func newInt() *int {
var i int
return i
}
someInt := newInt()
函數的功能跟 someInt := new(int) 一模一樣。定義 new 開頭的函數時,出于約定也應該返回類型的指針。
2、make 的主要特性
make 也是內建函數,定義比 new 多了一個參數,返回值也不同:
func make(Type, size IntegerType) Type
內建函數 make 用來為 slice,map 或 chan 類型分配內存和初始化一個對象(注意:只能用在這三種類型上),跟 new 類似,第一個參數也是一個類型而不是一個值,跟 new 不同的是,make 返回類型的引用而不是指針,而返回值也依賴于具體傳入的類型,具體說明如下:
Slice: 第二個參數 size 指定了長度,容量和長度相同。
可以傳入第三個參數來指定不同的容量值,但必須不能比長度值小。
比如 make([]int, 0, 10)
Map: 根據 size 大小來初始化分配內存,不過分配后的 map 長度為 0,如果 size 被忽略了,那么會在初始化分配內存時分配一個小尺寸的內存
Channel: 管道緩沖區依據緩沖區容量被初始化。如果容量為 0 或者忽略容量,管道沒有緩沖區。
3、總結
new 的作用是初始化一個指向類型的指針(*T),make 的作用是為 slice,map 或 chan 初始化并返回引用(T)。
Buffer 介紹
Buffer 是 bytes 包中的一個 type Buffer struct{…}
A buffer is a variable-sized buffer of bytes with Read and Write methods. The zero value for Buffer is an empty buffer ready to use.
(是一個變長的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個 空的 buffer,但是可以使用)
Buffer 就像一個集裝箱容器,可以存東西,取東西(存取數據)
創建緩沖器
輸出
寫入到緩沖器
buffer在new的時候是空的,也是可以直接Write的
Write
結果
WriteString
結果
WriteByte
WriteRune
結果
從緩沖器中寫出
讀出緩沖器
Read
ReadByte
返回緩沖器頭部的第一個byte
ReadRun
ReadRune方法,返回緩沖器頭部的第一個rune
為什么n==3,而n1==1呢?我們看下ReadRune 的源碼
ReadBytes
ReadBytes方法,需要一個byte作為分隔符,讀的時候從緩沖器里找出第一個出現的分隔符,緩沖器頭部開始到分隔符之間的byte返回。
相當于有一個分隔符
ReadString
和readBytes方法類似
讀入緩沖器
ReadFrom方法,從一個實現io.Reader接口的r,把r的內容讀到緩沖器里,n返回讀的數量
從緩沖器取出
Next方法,返回前n個byte(slice),原緩沖器變
緩沖區原理介紹
go字節緩沖區底層以字節切片做存儲,切片存在長度len與容量cap, 緩沖區寫從長度len的位置開始寫,當lencap時,會自動擴容。緩沖區讀會從內置標記off位置開始讀(off始終記錄讀的起始位置),當off==len時,表明緩沖區已全部讀完
并重置緩沖區(len=off=0),此外當將要內容長度+已寫的長度(即len) = cap/2時,緩沖區前移覆蓋掉已讀的內容(off=0,len-=off),從避免緩沖區不斷擴容
本文標題:go語言零值表,go0
網站URL:http://m.kartarina.com/article46/heiohg.html
成都網站建設公司_創新互聯,為您提供ChatGPT、電子商務、域名注冊、網站維護、網站建設、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯