主頁 > 後端開發 > Go語言基礎

Go語言基礎

2020-12-29 06:41:30 後端開發

一、Go基礎

識別符號:

? go語言中的識別符號由字母數字和下劃線(_)組成,并且只能以字母和下劃線(_)開頭

關鍵字:

? 關鍵字是指編程語言中預先定義好的具有特殊含義的識別符號,關鍵字和保留字都不建議用作變數名,

Go語言有25個關鍵字:

關鍵字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

Go語言有37個保留字:

型別 包含保留字
Constants true false iota nil
Types int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
Functions make len cap new append copy close delete complex real imag panic recover

1、變數宣告

  1. 變數的來歷

    ? 程式運行程序中的資料都是保存在記憶體中的,我們想要在代碼中操作某個資料時就要去記憶體上找到這個變數,但是如果我們直接在代碼中通過記憶體地址去操作變數的話,代碼的可讀性會非常差而且還容易出錯,所以我們就利用變數將這個資料的記憶體地址保存起來,以后直接通過這個變數就能在找到記憶體上對應的資料了,

  2. 變數型別

    ? 變數(Variable)的功能是存盤資料,不同的變數保存資料型別可能會不一樣,經過半個多世紀的發展,編程語言已經基本形成了一套固定的型別,常見的變數的資料型別有:整形、浮點型、布爾型等,

    ? Go語言中的每一個變數都有自己的型別,并且變數必須經過宣告才能開始使用,

  3. 變數的宣告

    ? Go語言中的變數需要宣告后才能使用,同一作用域內不支持重復宣告,并且Go語言的變數宣告后必須使用,

    • 標準宣告

      Go語言的變數宣告格式為:

      var 變數名 變數型別
      

      變數宣告以關鍵字var開頭,變數型別放在變數的后面,行尾無需分號,

      var name string
      var age int
      var isOK bool
      
    • 批量宣告

      每宣告一個變數就需要寫var關鍵字會比較繁瑣,go語言中還支持批量變數的宣告

      var(
      	a string
          b int
          c bool
          d float32
      )
      
    • 變數的初始化

      ? Go語言在宣告變數的時候,會自動對變數對應的記憶體區域進行初始劃操作,每個變數會被初始化成其型別的默認值,例如:整形和浮點型別變數的默認值為0,字串變數的默認值為空字串,布爾型別莫認為false,切片、函式、指標變數默認為nil

      也可以在宣告變數的時候為其指定初始值,變數初始化的標準格式如下:

      var 變數名 型別 = 運算式
      // 例
      var username string = "eric"
      var age int = 18
      

      也能一次初始化多個變數

      var name, age = "eric", 18
      
    • 型別推導

      有時候我們會將變數的型別省略,這個時候編譯器會根據等號右邊的值來推導變數的型別完成初始化,

      var name = "eric"
      var age = 18
      
    • 短變數宣告

      在函式內部,可以使用跟簡略的:=方式宣告并初始化變數,

      package main
      
      import ("fmt")
      // 全域變數m
      var m = 100
      
      func main(){
          n := 10
          m := 200  //此處宣告區域變數m
          fmt.PrintLn(m,n)
      }
      
      
    • 匿名變數

      在使用多重賦值的時候,如果想要忽略某個值,可以使用匿名變數(anonymous variable),匿名變數用一個下劃線_表示,例如:

      func foo() (int, string){
          return 18, "eric"
      }
      func main() {
          x,_ := foo()
          _,y := foo()
          fmt.Println("x=", x)
          fmt.Println("y=", y)
      }
      

      匿名變數不占命名空間,不會分配記憶體,所以匿名變數之間不存在重復宣告,(在Lua等變編程語言里,匿名變數也被叫做啞圓變數,)

      注意事項:

      1. 函式外的每個陳述句都必須以關鍵字開始(var、const、func等)
      2. :=不能使用在函式外,
      3. _多用于占位,表示忽略值,
      4. go語言中變數宣告必須使用,不適用就編譯不過去
      5. 同一個作用域({})中不能重復宣告同名的變數

2、常量

? 相對于變數,常量是恒定不變的值,多用于定義程式運行期間不會改變的那些值,常量的宣告和變數的宣告非常類似,只是把var換成了const,常量在定義的時候必須賦值,

const pi = 3.14159275453
const e = 2.7182

? 宣告了pi e 這兩個常量之后,在整個程式運行期間他們的值都不能再發生變化了,多個常量也可以一起宣告:

const(
	pi = 3.14159275453
    e = 2.7182
)

const同時宣告多個常量時,如果省略了值則表示和上面一行的值相同,例如:

const(
	n1 = 100
    n2
    n3
)
// n1,n2,n3的值都是100

3、iota

使用_跳過某些值

const(
	n1 = iote // 第一次默認為0
    n2        // 1
    _
    n4        //3
)

iota宣告中間插隊

const(
	n1 = iota // 0
    n2 = 100  // 100
    n3 = iota // 2
    n4        // 3
)
const n5 = iota // 0

? 定義數量級(這里的<<表示左移操作,1<<10表示將1的二進制向左移10位,也就是由1變成了10000000000,也就是十進制的1024,同理2<<2表示將2的二進制向左移2位,也就是由10變成了1000,也就是十進制的8,)

const(
	_ = iota
    KB = 1<<(10*iota)
    MB = 1<<(10*iota)
    GB = 1<<(10*iota)
    TB = 1<<(10*iota)
    PB = 1<<(10*iota)
)

多個iota定義在一行

const(
	a, b = iota + 1, iota + 2  // 1,2
    c, d                       // 2,3
    e, f                       // 3,4
)

二、Go的基本資料型別

? Go語言中有豐富的資料型別,除了基本的整形、浮點型、布爾型、字串外,還有陣列、切片、結構體、函式、map、通道(channel)等,Go語言的基本資料型別和其它語言大同小異,

1、整形

基本整形

整形分為以下兩個大類:

  • 按長度分為:int8、int16、int32、int64
  • 對應的無符號整形:uint8、uint16、uint32、uint64

其中,uint8是我們常用和熟知的byte型,int16對應C語言中的shot型(C:短整型),int64對應C語言中的long型(C:長整型),

型別 描述
uint8 無符號 8位整型 (0 到 255)
uint16 無符號 16位整型 (0 到 65535)
uint32 無符號 32位整型 (0 到 4294967295)
uint64 無符號 64位整型 (0 到 18446744073709551615)
int8 有符號 8位整型 (-128 到 127)
int16 有符號 16位整型 (-32768 到 32767)
int32 有符號 32位整型 (-2147483648 到 2147483647)
int64 有符號 64位整型 (-9223372036854775808 到 9223372036854775807)

特殊整形

型別 描述
uint 32位作業系統上就是uint32,64位作業系統上就是uint64
int 32位作業系統上就是int32,64位作業系統上就是int64
uintptr 無符號整型,用于存放一個指標

注意: 在使用intuint型別時,不能假定它是32位或64位的整型,而是考慮intuint可能在不同平臺上的差異,

注意事項:獲取物件的長度的內建len()函式回傳值的長度可以根據不同平臺的位元組長度進行變化,實際使用中,切片或map的元素數量等都可以用int來表示,在涉及到二進制傳輸、讀寫檔案的結構描述時,為了保持檔案的結構不會受到不同編譯目標平臺的位元組長度影響,不要使用intuint

數字字面量語法(Number literals syntax)

Go1.13版本之后引入了數字字面量語法,這樣便于開發者以二進制、八進制或十六進制浮點數的格式定義數字,例如:v:=0b001101101,代表二進制的101101,相當于十進制的45,v:=0o377,代表八進制的377,相當于十進制的255,v:=0x1p-2,代表十六進制的1除以22,也就是0.25,

package main
 
import "fmt"
 
func main(){
	// 十進制
	var a int = 10
	fmt.Printf("%d \n", a)  // 10
	fmt.Printf("%b \n", a)  // 1010  占位符%b表示二進制
 
	// 八進制  以0開頭
	var b int = 077
	fmt.Printf("%o \n", b)  // 77
 
	// 十六進制  以0x開頭
	var c int = 0xff
	fmt.Printf("%x \n", c)  // ff
	fmt.Printf("%X \n", c)  // FF
}

2、浮點型

Go語言中有兩種浮點型數:float32float64,這兩種浮點型資料格式遵循IEEE 754標準:flaot32的浮點最大范圍約為1.8e308,可以使用一個常量定義:mathMaxFloat64

列印浮點數時,可以使用fmt包配合動詞%f,代碼示例:

package main
import (
    "fmt"
    "math"
)
func main() {
    fmt.Printf("%f\n", math.Pi)
    fmt.Printf("%.2f\n", math.Pi)
    // 浮點數
	asd := 3.1415926
	fmt.Printf("%T\n", asd) // 默認Go語言中的小鼠都是float64型別
	asf := float32(3.14159)
	fmt.Printf("%T\n", asf) // 顯示宣告float32型別
	// asd = asf  // float32型別的值不能直接賦值給float64,反之還真不能
}

3、復數

兩種資料型別complate64和complate128

package main
import (
    "fmt"
    "math"
)
func main() {
    var c1 complex64
    c1 = 1 + 2i
    var c2 complex128
    c2 = 2 + 3i
    fmt.Println(c1)
    fmt.Println(c2)
}

4、布林值

Go語言中以bool型別進行宣告布爾型別資料,布爾型別資料只有true(真)falde(假)兩個值,

注意:

  1. 布爾型別變數的默認值為false
  2. Go語言中不允許將整形強制轉換為布爾型,
  3. 布爾型無法參予數值運算,也無法與其它型別進行轉換,

5、字串

Go語言中的字串以原生資料型別出現,使用字串就像使用其他原生資料型別(int、bool、float32、float64等)一樣,Go語言里的字串的內部實作使用UTF-8編碼,字串的值為雙引號(")中的內容,可以在Go語言的原始碼中直接添加非ASCII碼字符,例如:

s1 := "hello"
s2 := "你好"

字串轉義符

Go語言的字串常見轉義符包含回車、換行、單雙引號、制表符等,如下表格所示,

轉義符 含義
\r 回車符(回傳行首)
\n 換行符(直接跳到下一行的同列位置)
\t 制表符
\' 單引號
\" 雙引號
\\ 反斜杠

舉個例子,我們要列印一個Windows平臺下的一個檔案路徑:

package main
import (
    "fmt"
)
func main() {
    fmt.Println("str := \"c:\\User\\AppDate\\.go\"")
}

多行字串

Go語言中要定義一個多行字串時,就必須使用反引號字符:

package main
import (
    "fmt"
)
func main() {
	asd := `第一行
第二行
第三行`
	fmt.Println(asd)
}

反引號間換行將被作為字串中的換行,但是所有的轉義字符均無效,文本將會原樣輸出,

字串的常用操作

方法 介紹
len(str) 求長度
+或fmt.Sprintf 拼接字串
strings.Split 分割
strings.contains 判斷是否包含
strings.HasPrefix,strings.HasSuffix 前綴/后綴判斷
strings.Index(),strings.LastIndex() 子串出現的位置
strings.Join(a[]string, sep string) join操作

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241699.html

標籤:Go

上一篇:[GO] golang happen before 的保證原則

下一篇:你好,Spring!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more