1. 程式人生 > >Go學習筆記-第1章

Go學習筆記-第1章

Go 學習筆記

第一章 型別

1.1 變數

Go 語言變數名由字母、數字、下劃線組成,其中首個字母不能為數字。
Go 是靜態型別語⾔,不能在運⾏期改變變數型別。
使⽤關鍵字 var 定義變數,⾃動初始化為零值。如果提供初始化值,可省略變數型別,由編譯器⾃動推斷。

var x int 
var y int  = 1
var radius float32 = 2.0
var str = "Hello Go"

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

var func main(){
    m:="abc"
} 

可以一次定義多個變數。

var x,y,z int
//定義全域性變數 var m,n = "abc",123 var ( a int b float32 ) var func main(){ i := "Hello Go" //編譯器會將未使⽤的區域性變數當做錯誤=>i declared and not used。 println(x, n, b) }

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

var (
    a int
    b float32
)

func main() {
    println(&a)

    m := "Hello Go"
    println(&m)

    m, n := "what?"
, 10 // 重新賦值: 與前 m 在同 層次的程式碼塊中,且有新的變數被定義。 println(&m, n) a := 12 // 定義新同名變數: 不在同層次程式碼塊。 println(&a) }

輸出結果

0x10b29a8
0xc420039f68
0xc420039f68 10
0xc420039f60

1.2 常量

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

const x, y, z = 1, "Hello Go", false //多常量初始化

const ( //常量組
    m    = false
    n    = false
i, j = "abc", 1 //型別自動判斷 ) func main() { const x = 2//未使用區域性常量不會引發編譯錯誤 }

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

const ( //常量組
    m = false
    n   //n = false
    i = 10
    j   //j = 10
)

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

const (
    x = "Hello Go"
    y = len(x)
    z = unsafe.Sizeof(x)
)

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

const (
    x byte = 20
    y int  = 1e20//constant 100000000000000000000 overflows int
)

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

const (
    Sunday = iota //0
    Monday        //1
    Tuesday       //2
    Wednesday     //3
    Thursday      //4
    Friday        //5
    Saturday      //6
)
const (
    _        = iota             // iota = 0
    KB int64 = 1 << (10 * iota) // iota = 1
    MB                          // 與 KB 表示式相同,但 iota = 2  等同於=> MB int64 = 1 << (10 * 2)
    GB
    TB
)

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

const (
    A, B = iota, iota << 10 //0,0 << 10
)

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

const (
    A = iota //1
    B        //2
    C = "c"  //c
    D        //c
    E = iota //4 顯式恢復。注意計數包含了 C、D 兩行 。
    F        //5
    G        //6
)

1.3 基本型別

支援八進位制、 十六進位制,以及科學記數法。標準庫 math 定義了各數字型別取值範圍。

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

空指標值 nil

1.4 引用型別

引 型別包括 slice、map 和 channel。它們有複雜的內部結構,除了申請記憶體外,還需
要初始化相關屬性。
內建函式 new 計算型別 ,為其分配零值記憶體,返回指標。 make 會被編譯器翻譯 成具體的建立函式,由其分配記憶體和初始化成員結構,返回物件 指標。

number := []int{0, 0, 0}
number[1] = 10

x := make([]int, 3) // len = 3  slice.c: runtime·makeslice
x[1] = 10

y := new([]int)
y[0] = 10 // Error: invalid operation: y[1] (index of type *[]int)

1.5 型別轉換

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

var x byte = 10
//var m int = x //cannot use x (type byte) as type int in assignment
y := int(x)

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

var x  = 1
if x {//non-bool x (type int) used as if condition
    println("true")
}

1.6 字串

字串是不可變值型別,內部⽤指標指向 UTF-8 位元組陣列。
• 預設值是空字串 “”。
• ⽤索引號訪問某位元組,如 s[i]。
• 不能⽤序號獲取位元組元素指標,&s[i] ⾮法。
• 不可變型別,⽆法修改位元組陣列。
• 位元組陣列尾部不包含 NULL。

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.
type string string

使⽤索引號訪問字元 (byte)。

var str = "Hello Goland"

println(str[0] == 72, str[1], str[len(str)-1])

輸出

true 101 100

連線跨⾏字串時,”+” 必須在上⼀⾏末尾,否則導致編譯錯誤。

var str = "Hello " + " Goland"

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

println(str)
println(s2)

⽀持⽤兩個索引號返回⼦串。⼦串依然指向原位元組陣列,僅修改了指標和⻓度屬性。

str := "Hello " + " Goland"

str1 := str[1:]  //ello  Goland
str2 := str[:6]  //Hello 
str3 := str[2:5] //llo

println(str1)
println(str2)
println(str3)

單引號字元常量表⽰ Unicode Code Point,⽀持 \uFFFF、\U7FFFFFFF、\xFF 格式。
對應 rune(int32) 型別,UCS-4。

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

輸出

int32
true true

要修改字串,可先將其轉換成 []rune 或 []byte,完成後再轉換為 string。⽆論哪種轉
換,都會重新分配記憶體,並複製位元組陣列。

str := "Hello Goland"
number := "110"

s := []byte(str)
phone := []rune(number)

s[0] = 'F'
phone[len(number)-1] = '9'

println(string(s))
println(string(phone))

輸出

Fello Goland
119

⽤ for 迴圈遍歷字串時,也有 byte 和 rune 兩種⽅式。

str := "Hello"

for i := 0; i < len(str); i++ { //byte
    fmt.Printf("str[%d] = %c \n", i, str[i])
}

for _, value := range str {     //rune
    fmt.Printf("%c\n", value)
}

輸出

str[0] = H 
str[1] = e 
str[2] = l 
str[3] = l 
str[4] = o 
H
e
l
l
o

1.7 指標

⽀持指標型別 T,指標的指標 **T,以及包含包名字首的 \

type User struct {
    name string
}

user := User{"小強"}
userIp := &user

var ipStr *User
ipStr = &user

println(ipStr)
println(userIp)
fmt.Printf("name=%s\n", userIp.name) 

輸出

0xc420039f58
name=小強
0xc420039f58

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

number := 1234
p := &number
p++ //invalid operation: p++ (non-numeric type *int)

可以在 unsafe.Pointer 和任意型別指標間進⾏轉換。

x := 0x12345678
p := unsafe.Pointer(&x) // *int -> Pointer
n := (*[4]byte)(p)      // Pointer -> *[4]byte
for i := 0; i < len(n); i++ {
    fmt.Printf("%X ", n[i])
}

輸出

78 56 34 12 0xc420039f48

返回區域性變數指標是安全的,編譯器會根據需要將其分配在 GC Heap 上。

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

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

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

輸出

struct { s string; x int }{s:"abc", x:200}

注意:GC 把 uintptr 當成普通整數物件,它⽆法阻⽌ “關聯” 物件被回收。

相關推薦

Go學習筆記-1

Go 學習筆記 第一章 型別 1.1 變數 Go 語言變數名由字母、數字、下劃線組成,其中首個字母不能為數字。 Go 是靜態型別語⾔,不能在運⾏期改變變數型別。 使⽤關鍵字 var 定義變數,⾃動初始化為零值。如果提供初始化值,可省略變數型別,

java程式設計思想學習筆記——1 物件導論

1.1 抽象過程 面向物件思想的實質:程式可以通過新增新型別的物件使自身適用於某個特定問題。 面向物件思想的五個基本特徵: 1)萬物皆物件 2)程式是物件的集合 3)每個物件都有自己的由其他物件所構成的儲存 4)每個物件都有其型別 5)某一特定型別的所有物件都可以接收同樣的訊息 物件具有行為、

爬蟲學習筆記1

人說最好的學習是教學,我深以為然。為了理清學習這本書《Python3爬蟲網路爬蟲開發實戰》的一些概念,開始寫本系列。這個系列的博文將 提煉書中重點核心理念 記錄我在學習這本書時遇到的非技術性問題及其解決方案 給出我個人的觀點和建議 有些內容我暫時不會寫到——

C primer plus 學習筆記 1

第1章    初識C語言 這章主要介紹了一些C語言的歷史,還有編寫程式的過程。 主要內容: C的歷史和特性 編寫程式的步驟 編譯器和連結器的一些知識 C標準 1.1    C語言的起源 1972,貝爾實驗室 1.2    選擇C語言的理由 高效性,可移植性,可直接訪問

Android學習筆記1之掌握日誌工具

備註:參考《第一行程式碼》 一、Android中的日誌工具類是Log(android.util.Log),這個類共提供了5種方法來供我們列印日誌。 1.Log.v()。用於列印那些最為瑣碎的、意義最小的日誌資訊。對用的級別是verbose,是Android日誌裡

RTthread學習筆記————1 嵌入式作業系統

什麼是作業系統  作業系統是指管理和控制計算機硬體與軟體資源的計算機程式,是直接執行在計算機上的最基 本的系統軟體,任何其他軟體都必須在作業系統的支援下才能執行,按應用領域來劃分,可分為桌 面作業系統、伺服器作業系統、移動作業系統、和嵌入式作業系統幾類。  嵌

MySQL 5.1參考手冊學習筆記 1:一般資訊

1.2. 本手冊採用的慣例 ·這類風格的文字用於SQL語句,資料庫、表和列名稱,C和Perl程式碼,以及環境變數。例如: 要想重新載入授權表,請使用FLUSH PRIVILEGES語句。 這類風格的文字用於指明鍵入的數如資訊

神經網路與機器學習3版學習筆記-1 Rosenblatt感知器

神經網路與機器學習第3版學習筆記       -初學者的筆記,記錄花時間思考的各種疑惑 第一章 Rosenblatt感知器 1、第32頁 1.1 為什麼如果第n次迭代時的內積存在符號錯誤,第n+1次迭代內積的符號就會正確?     已知 $

Hadoop權威指南-大資料的儲存與分析四版——學習筆記——2——1

MapReduce 適合處理半結構化的資料 MapReduce任務階段 Map階段+Reduce階段 Key-Value作為輸入輸出 實現兩個函式:map(),reduce() Map階段 輸入的Key:文字中的偏移量 輸入的value:文字 輸出的k-v給reduce處

《白話深度學習與Tensorflow》讀書筆記--1:機器學習是什麼

機器學習從學習的種類來說,可以分為兩種: 1.無監督學習,即人們獲得訓練的向量資料後在沒有標籤的情況下嘗試找出其內部蘊含關係的一種挖掘工作。 2.有監督學習,即每一個樣本都有著明確的標籤,最後總結出這些訓練向量與標籤的對映關係。 1.1 聚類 定義:是一種典型

爬蟲學習筆記4.解析庫的使用.1 使用XPath

XPath:全稱XML Path Language(XML路徑語言),一門用於XML 文件中查詢資訊的語言。XPath 用於在 XML 文件中通過元素和屬性進行導航。XPath同樣可以用於HTML的搜尋。 XPath 路徑表示式:XPath 使用路徑表示式來選取

&lt;&lt;Python基礎教程&gt;&gt;學習筆記 | 12 | 圖形用戶界面

lena text 平臺 post ack 由於 contents exp 一個 Python支持的工具包非常多。但沒有一個被覺得標準的工具包。用戶選擇的自由度大些.本章主要介紹最成熟的跨平臺工具包wxPython.官方文檔: http://wxpython.org/

Unity Shader入門精要學習筆記 - 4 學習 Shader 所需的數學基礎

旋轉矩陣 即使 模擬 能夠 一點 空間使用 虛擬 地板 金字塔 摘錄自 馮樂樂的《Unity Shader入門精要》 笛卡爾坐標系 1)二維笛卡爾坐標系 在遊戲制作中,我們使用的數學絕大部分都是計算位置、距離、角度等變量。而這些計算大部分都是在笛卡爾坐標系下進行的。 一個二

Unity Shader入門精要學習筆記 - 3 Unity Shader 基礎

但是 detail spa net 表示 part 文件 人的 text 來源作者:candycat http://blog.csdn.net/candycat1992/article/ 概述 總體來說,在Unity中我們需要配合使用材質和Unity Shader才能達

Unity Shader入門精要學習筆記 - 11 讓畫面動起來

位置 視覺效果 想要 朝向 系列 圖像 顏色 offset star 轉自 馮樂樂的 《Unity Shader入門精要》 Unity Shader 中的內置變量 動畫效果往往都是把時間添加到一些變量的計算中,以便在時間變化時畫面也可以隨之變化。Unity Shader 提

Unity Shader入門精要學習筆記 - 16 Unity中的渲染優化技術

也會 檢測 特點 著色器 版本 切換 代碼優化 學習 順序 轉自馮樂樂的 《Unity Shader 入門精要》 移動平臺的特點 為了盡可能一處那些隱藏的表面,減少overdraw(即一個像素被繪制多次),PowerVR芯片(通常用於ios設備和某些Android設備)使用

Unity Shader入門精要學習筆記 - 14非真實感渲染

只需要 遮擋 本質 lar 屏幕 準備 dot smo try 轉載自 馮樂樂的 《Unity Shader 入門精要》 盡管遊戲渲染一般都是以照相寫實主義作為主要目標,但也有許多遊戲使用了非真實感渲染(NPR)的方法來渲染遊戲畫面。非真實感渲染的一個主要目標是,使用一些渲

Unity Shader入門精要學習筆記 - 10 高級紋理

unp string math 計算 圖像繪制 兩種方法 內存 對象 交叉 轉載自 馮樂樂的 《Unity Shader入門精要》 立方體紋理 在圖形學中,立方體紋理是環境映射的一種實現方法。環境映射可以模擬物體周圍的環境,而使用了環境映射的物體可以看起來像鍍了層金屬一樣反

增強學習筆記 動態規劃

策略 blog 條件 並不是 算法 方法 進行 規劃 分享 最優價值函數滿足下列條件: 4.1 策略評估 策略評估通過反復叠代的方式來進行: 4.2 策略改進 4.3 策略叠代 綜合4.1和4.2,得到策略叠代算法: 4.4 價值叠代 對4.3進行簡化,兩步

增強學習筆記 蒙特卡洛方法

兩個 width 重要 思想 後者 src 兩種方法 預測 eps 5.1 蒙特卡洛預測 分為兩種:First-Visit MC和Every-Visit MC,前者用的更多。後者用於函數近似和Eligibility Traces 5.2 蒙特卡洛評估action valu