主頁 > 後端開發 > Go語言學習筆記(二)

Go語言學習筆記(二)

2020-09-15 05:51:57 後端開發

一、字符

1、概述

  • 字符型存放單個字母或單個文字
  • GO語言不支持字符型別,在GO語言中所有字符值都轉換為對應的編碼表中int32值
  • GO語言默認使用UTF8編碼

2、編碼發展歷史

  • 最開始使用8個可開合晶體管表示世間萬物,這就是位元組的由來,后來生產出可以控制位元組的機器,出現了計算機
  • 把位元組中32以下情況稱為控制碼,后再控制碼基礎上添加空格、標點符號、數字、大小寫字母等直到127,最終形成了ASNI的ASCII碼,這是已經較好的支持英文了
  • 隨著計算機在全球的應用,在原ASCII基礎上添加了新的字母、符號、橫線豎線等直到255號,從128到255被稱為擴展字符集,但是此時計算機還是在支持英文
  • 等中國開始使用計算機,為了支持中文,保留了前127號,這些稱為半角,把后面的內容以兩個位元組拼接形成中文漢字和表單符號,這后半部分就是全角,其中漢字6763個滿足中文大部分情況的要求稱為GB2312
  • 隨著計算機在中國的普及,使用GB2312時有的漢字無法打出,又在GB2312基礎上添加了近20000個漢字(包含繁體和符號等)形成GBK,后來為支持少數民族又在GBK基礎上退出了GB18080
  • 全球中每個國家都有自己的一套編碼,ISO國際為了統一標準,重新定義了一套編碼,希望包含全球所有的文字和符號,俗稱Unicode
  • 隨著互聯網的快速發展,為緩解Unicode網路傳輸中流量浪費問題,出現了UTF編碼,有UTF-8(8位傳輸)和UTF-16(16位傳輸)兩種,其中UTF-8使用最多,為變長編碼方式,中文占3個位元組

二、轉義字符

1、轉義字符介紹

  • 在GO語言中可以使用%+特定字母形成轉義字符,這個表示特定含義的組合成為轉義字符

  • 在GO語言中又稱為verb

  • 轉義字符在GO語言中以下兩種情況使用頻率較高

fmt.Print("verb",內容)//輸出
fmt.Scanf("verb",接受變數)//輸入

2、進制描述

  • 進制數在編程中經常遇見,進制數分為二進制、八進制、十進制、十六進制,其中十進制就是平常我們接觸最多的
  • X進制都滿足:
    • 滿X進一位
    • 每位最大為X-1
    • 第N位代表X的(n-1)次方
  • 其中十六進制中a=10,b=11,c=12,d=13,e=14,f=15

3、常用轉義字符匯總

Verb 含義
%d 十進制整數
%x、%X 大小寫方式顯示十六進制整數
%o 八進制整數
%b 二進制整數
%f、%g、%e 浮點數
%t 布林值
%c 字符
%s 字串
%q 帶雙引號字串
%v 內置格式內容
%T 型別
%p 記憶體地址
%% 字符%
\n 換行
\t 縮進

三、用戶輸入

1、簡介

  • 用戶輸入在平時練習中使用頻率較高
  • 程式運行時,運行到接受用戶輸入陳述句會阻塞,等待用戶輸入,用戶輸入后,把內容賦值給對應的變數后,程式繼續運行
    • 在GO語言中有多重接受用戶輸入的方式,其中使用fmt包的Scan函式使用最簡單

2、接收用戶輸入的幾種方式

  • 使用Scanln(&變數名,&變數名)的方式接收

    • 輸入的內容必須都在同一行
    • 每個內容之間使用空格分隔
    • 回車換行后表示停止輸入
    • 如果希望接收3個值,而在控制臺只輸入2個值,回車后也停止接收
    • 如果希望接收2個值,而在控制臺輸入3個,回車后只能接收兩個值
package main
  
import "fmt"
  
func main() {
	var name, age string
	fmt.Print("請輸入用戶姓名和年齡:")
	fmt.Scanln(&name, &age)
	fmt.Println("接收到內容為:", name, age)
}
  • 也可以使用fmt.Scanf(verb,&變數)按照特定的格式進行輸入

    • 下面例子演示的每次換行輸入一個內容
package main
  
import "fmt"
  
func main() {
   var a, b string
   fmt.Println("請輸入姓名和年齡:")
   fmt.Scanf("%s\n%s", &a, &b)
   fmt.Printf("%s\n%s", a, b)
}
  • 需要注意,如果同行輸入兩個字串,中間使用空格,否則編譯器無法對輸入內容進行拆分

四、輸出

1、列印輸出

  • 在程式中輸出使用頻率很高,使用輸出陳述句可以再程式執行程序中把一些結果輸出到控制臺,程式員通過控制臺中輸出結果判斷是否符合預期
  • 在GO語言中有多重輸出方式,不同的輸出適用場景不同,歸納起來三類,每類又分為三種(原內容、原內容+ln、原內容+f)
    • PrintXX()
    • FprintXX()
    • SprintXX()

2、FprintXX()

  • FprintXX在Go Web中使用比較多,把內容寫到回應中
  • 以Fprintln()舉例,原始碼如下:
// Fprintln formats using the default formats for its operands and writes to w.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
	p := newPrinter()
	p.doPrintln(a)
	n, err = w.Write(p.buf)
	p.free()
	return
}
  • 函式引數中第一個引數是輸出流,后面引數是內容,表示把內容寫入到輸出流中

  • 第一個回傳值表示輸出內容長度(位元組數),第二個回傳值表示錯誤,如果沒有錯誤取nil

    • Fprintln()輸出后會添加換行符,所以長度比內容多1個
    • Fprintln()原始碼中p.doPrintln(a)的原始碼
// doPrintln is like doPrint but always adds a space between arguments
// and a newline after the last argument.
func (p *pp) doPrintln(a []interface{}) {
	for argNum, arg := range a {
		if argNum > 0 {
			p.buf.writeByte(' ')
		}
		p.printArg(arg, 'v')
	}
	p.buf.writeByte('\n')
}
  • FprintXX()支持下面三種方式

    • os.Stdout表示控制臺輸出流
func main() {
	fmt.Fprint(os.Stdout, "內容1")//向流中寫入內容
	fmt.Fprintln(os.Stdout, "內容2")//向流中寫入內容后額外寫入換行符
	fmt.Fprintf(os.Stdout, "%s", "內容3")//根據verb格式向流中寫入內容
}

3、PrintXX

  • PrintXX支持以下三種方式
func main(){
	fmt.Println("內容1")//輸出內容后換行
	fmt.Print("內容2")//輸出內容后不換行
	fmt.Printf("verb","內容")//根據verb輸出指定格式內容
}
  • 以Println()舉例,原始碼如下
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error) {
   return Fprintln(os.Stdout, a...)
}
  • 可以看出Println()底層實際是Fprintln(),回傳值依然是內容長度和錯誤資訊

4、SPrintXX

  • 以SPrintln() 為例,和Println()主要的區別是:
    • Sprintln()把形式結果以字串回傳,并沒有列印到控制臺
    • Println()把結果列印到控制臺,回傳內容長度和錯誤
  • 所以嚴格意義角度講SprintXX不是列印輸出,而更像字串轉換
  • 原始碼如下
// Sprint formats using the default formats for its operands and returns the resulting string.
// Spaces are added between operands when neither is a string.
func Sprint(a ...interface{}) string {
   p := newPrinter()
   p.doPrint(a)
   s := string(p.buf)
   p.free()
   return s
}
  • 也有三種方式
fmt.Sprint("內容1", "內容2")
fmt.Sprintf()
fmt.Sprintln("1", "2")

五、變數宣告和賦值

1、靜態語言和動態語言

  • 靜態型別語言和強型別語言是同一個意思,表示在編譯器就確定了型別,而且型別是不可以改變的
  • 動態型別語言和弱型別語言是同一個意思,表示在運行程序中才能確定且內容是什么型別變數型別跟隨變化

2、GO語言變數簡介

  • go語言和其他語言一樣都有基本存盤容器,可以存盤一個或多個值在程式中,方便程式中多次使用容器中內容,這個容器稱為變數
  • GO語言雖然是靜態型別語言,但是支持動態型別語言語法,因為GO語言希望程式員少宣告變數,增加GC效率

3、變數命名規則

  • 以字母或下劃線開頭(GO語言多不以_開頭)
  • 后面可以是任意數量的字符、數字和下劃線
  • 區分大小寫
  • 不能是關鍵字(關鍵字具備特定含義),下面是GO語言的關鍵字
關鍵字如下
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語言的保留字
保留字如下
true false iota nil int
int8 int16 int32 int64 unit
unit8 unit16 unit32 unitptr float32
float64 complex128 complex64 bool byte
rune string error make len
cap new append copy close
deletecomplex real image panic recover
  • 在同一范圍內不允許出現同名變數
  • GO語言要求變數宣告后至少使用一次

4、單個變數宣告及賦值

  • 先宣告后賦值(宣告后開辟記憶體,不同型別變數都有不同初始值)
//語法
//1.宣告
var 變數名 型別
//2.賦值
變數名=值
  • 宣告并賦值(此方式不建議)
//語法
var 變數名 型別 = 值

//實體
var smallming string = "英文名"
  • 宣告并賦值(省略型別,變數型別取決于值的型別)
//語法
var 變數名 = 值
  • 短變數(只能在函式內使用)
//語法
變數名 := 值

5、宣告多個變數

  • 先宣告后賦值
func main(){
	var a,b,c int
	a,b,c = 1,2,3
	fmt.Println(a,b,c)
}
  • 宣告時賦值
func main(){
	var a,b,c,d = 1,2,3,false
	fmt.Println(a,b,c,d)
}
  • 宣告并賦值,推薦方式
func main(){
	var (
		a = 1
		b = true
		c = "測驗"
	)
	fmt.Println(a,b,c)
}
  • 使用短變數給多個變數賦值時,必須要保證至少有兩個變數沒有宣告的
func main(){
    var (
        a = 1
        b = true 
        c = "測驗"
    )
    b,c,d := false, "smallming", 3
    fmt.Println(a,b,c,d)
}

六、整型

1、概述

  • 在GO語言中可以進行資料運算的型別分為整型和浮點型

  • 所有的整數數字存盤到整型中就可以進行數學運算

    • 整型和整型運算的結果還是整型(5/2=2)
    • 都是整型,但是int8 和int16之間不可以進行運算,必須進行型別轉換
  • 整型分為有符合整型和無符號整型

    • 有符號整型有正數和負數,其二進制最高位表示符號,0為正數1為負數,int和intx為有符號整型
  • 無符號整型只能取大于等于0的整數,其二進制最高位表示真實數字,unit和unitx為無符號整型

  • 整型取值范圍和作用

    • 有符號整數統一公式為:-2的n-1次冪到2的n-1次冪減1
  • 無符號整數統一公式為

型別 取值范圍
int8 [-128,127]
int16 [-32768,32767]
int32 [-2147483648,2147483647],GO語言沒有字符型別,所有字符都使用int32
int64 [-92233722036854775808,9223372036854775807]
int 受限于計算機系統,系統是多少位,int為多少位
unit8 [0,255]
unit16 [0,65535]
unit32 [0,4294967295]
unit64 [0,18446744073709551615]
uint 受限于計算機系統,系統是多少位,uint為多少位
rune 與int32類似,常用在獲取值的Unicode碼
byte 與uint8類似,強調值為原始資料,一個位元組占用8個二進制
uintptr 大小不確定,類似取決于底層編程

2、型別轉換

  • GO語言是靜態型別語言,并且不具備低精度向高精度自動轉換功能,所以不同型別變數之間相互賦值需要進行型別轉換
package main

import "fmt"

func main() {
	//宣告3個型別變數
	var a int = 1
	var b int32 = 2
	var c int64 = 3

	fmt.Println(a, b, c)

	//把int32轉換為int64
	a = int(b)
	fmt.Println(a, b)
	a = 1

	//把int64轉換為int32
	b = int32(c)
	fmt.Println(b, c)
	b = 2

	//把int轉換為int64
	c = int64(a)
	fmt.Println(a, c)
	c = 3
}

3、不同進制整數

  • 支持八進制、十進制、十六進制數字創建整型,最后由系統轉換為十進制
  • 不支持二進制值
package main

import "fmt"

func main() {
	//默認表示十進制
	d := 17

	//0開頭表示八進制
	o := 021

	//0x開頭表示十六進制
	x := 0x11

	//e2表示10的2次方
	e := 11e2

	//輸出
	fmt.Println(d, o, x, e)

	//把變數d中內容轉為二進制
	b := fmt.Sprintf("%b", d)
	fmt.Println(b)
}

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

標籤:Go

上一篇:Go檔案:Command go

下一篇:Go語言基礎之單元測驗

標籤雲
其他(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