最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解

 更新時間:2022年07月20日 09:27:47   作者:最厲害的菜雞  
這篇文章主要為大家介紹了go語言中基本數(shù)據(jù)類型應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

整數(shù)

按位長度分度分為:8位,16位,32位,64位。

對應(yīng)有符號整數(shù):int8,int16,int32,int64。

對應(yīng)無符號整數(shù):uint8,uint16,uint32,uint64。

計(jì)算最大數(shù)和最小數(shù)規(guī)則:

  • 有符號整數(shù):由于有符號,因此位數(shù)的最高位被用來存儲符號,其他為存儲數(shù)據(jù)值,所以對于n位數(shù)來說,取值范圍是:-2^(n-1)^~2^(n-1)^-1,對應(yīng)int8來說,就是 -127 ~ 127。
  • 無符號正數(shù):不需要用最高位記錄符號,全部位數(shù)表示數(shù)字。取值范圍是:0 ~ 2^n^-1。對于int8來說,就是0 ~ 255。

特殊的整數(shù)類型

intuint以及uintptr。

intuint根據(jù)特定的平臺,其大小與原生的整數(shù)相同或者是該平臺上運(yùn)算效率最高的值。要么同時是64位,要么同時是32位,但也不能假定他們就是64位或者32位的整型。即使在一樣的硬件下,不同編譯器也有可能選用不同的大小。

至于uintptr,它的大小并不明確。但它肯定足夠容納一個指針的大小。常用于底層編程。

雖然int、uint的長度可能與int32、int64..其他整型相同但是他們是不同的類型。

如果想確定intuint的大小

fmt.Println(runtime.GOARCH)		// 看看CPU型號
fmt.Println(strconv.IntSize)	// 這才是int的大小,上面只是提供一個對照

溢出

不論是有符號數(shù)還是無符號數(shù),若計(jì)算結(jié)果所需的位超出類型的范圍,就稱為溢出。溢出的高位會被無提示地拋棄。

var i int8 = -128
fmt.Println(i-1)	// 127
var i2 int8 = 127
fmt.Println(i2+1)	// -128
var u uint8 = 0
fmt.Println(u-1)	// 255
var u2 uint8 = 255
fmt.Println(u2+1)	// 0

浮點(diǎn)數(shù)

float32、float64。遵循IEEE 754標(biāo)準(zhǔn)。

math.MaxFloat32給出了float32類型的最大值:3.4028234663852886e+38。

math.MaxFloat64則是float64類型的最大值:1.7976931348623157e+308。

浮點(diǎn)數(shù)可以用來表示小數(shù)。

十進(jìn)制下,float32有效位大約是6位。float64有效位大約是15位。

浮點(diǎn)數(shù)的打印可以使用:

  • %g,保留足夠的精度顯示
  • %e,使用指數(shù)形式顯示
  • %f,使用無指數(shù)形式顯示
f := 2.71828
fmt.Printf("%g, %[1]e, %[1]f \n", f)	// 2.71828, 2.718280e+00, 2.718280

復(fù)數(shù)

complex64complex128 ,二者分別由float32float64組成。

使用real函數(shù)提取復(fù)數(shù)的實(shí)部,使用imag函數(shù)提取復(fù)數(shù)的虛部。

浮點(diǎn)數(shù)或者整數(shù)后面加i就會變成一個虛數(shù),且它的實(shí)部為0。

x := 1+2i
y := 3+4i

布爾值

bool類型就是布爾值,有true(真)和false(假)兩個值。

布爾值無法隱式轉(zhuǎn)換成數(shù)值,數(shù)值也不能轉(zhuǎn)成布爾值。

它的零值是false。

一元操作符!表示邏輯取反。!true表示false。

字符串

string表示字符串。它是不可變的字節(jié)序列。Go中的字符串內(nèi)部實(shí)現(xiàn)用UTF-8編碼。

字符串的“長度”與遍歷字符串的做法

字符串的“長度”

對字符串調(diào)用len函數(shù),獲取到的不是字符串的長度(字符的個數(shù)),而是字符串的字節(jié)數(shù)(字節(jié)切片的長度)。

如下,盡管字符個數(shù)只有6,但字節(jié)長度len(s)卻有18,這是因?yàn)橹形淖址?code>UTF-8存儲,通常包含3~4個字節(jié)。

s := "中文字節(jié)數(shù)多"
fmt.Println("len: ", len(s))	// len:  18

對字符串使用下標(biāo)索引操作,會返回對應(yīng)索引的字節(jié),而不是字符。

s := "中文字節(jié)數(shù)多"
fmt.Println("len: ", len(s))	// len:  18
for i :=0; i < len(s); i++ {
    fmt.Printf("%d, %[1]c, %[1]T\n",s[i])
}

對應(yīng)的輸出如下:

len: 18
228, ä, uint8
184, ¸, uint8
173, ­, uint8
230, æ, uint8
150, ?, uint8
135, ?, uint8
229, å, uint8
173, ­, uint8
151, ?, uint8
232, è, uint8
138, ?, uint8
130, ?, uint8
230, æ, uint8
149, ?, uint8
176, °, uint8
229, å, uint8
164, ¤, uint8
154, ?, uint8

因此不要隨便亂用字符串的下標(biāo)操作,否則可能獲得有意想不到的結(jié)果。

遍歷字符串

由上面的下標(biāo)操作可以看出,對字符串的下標(biāo)索引操作會獲得單個字節(jié)而不是字符,假如現(xiàn)在我們想處理的是UTF-8解碼的字符的話,有兩種方式,基本思路都是處理成rune類型:

第一種,用UTF-8解碼器顯式處理這些字符,unicode/utf8包示例。

utf8.RuneCountInString(s)返回字符串轉(zhuǎn)為rune后的個數(shù),Go使用rune代表一個UTF-8字符。

utf8.utf8.DecodeRuneInString(s[i:])處理當(dāng)前字符串,并算出下一個rune以及它所占的字節(jié)數(shù)。

s := "What? 中文字節(jié)數(shù)多"
runeCount := utf8.RuneCountInString(s)
fmt.Println("runeCount:", runeCount)	// runeCount: 12
for i:= 0; i<len(s); {
	r, size:= utf8.DecodeRuneInString(s[i:])
	fmt.Printf("i: %d, r:%q, type:%T \n", i, r, r)
	i += size
}

輸出如下:

runeCount: 12
i: 0, r:'W', type:int32
i: 1, r:'h', type:int32
i: 2, r:'a', type:int32
i: 3, r:'t', type:int32
i: 4, r:'?', type:int32
i: 5, r:' ', type:int32
i: 6, r:'中', type:int32
i: 9, r:'文', type:int32
i: 12, r:'字', type:int32
i: 15, r:'節(jié)', type:int32
i: 18, r:'數(shù)', type:int32
i: 21, r:'多', type:int32

第二種,用range循環(huán),Go會隱式的進(jìn)行UTF-8解碼。

注意,這里的i,指的是字節(jié)的下標(biāo),而不是字符的下標(biāo)。

s := "What? 中文字節(jié)數(shù)多"
for i, r := range s {
    fmt.Printf("i: %d, rune: %q, type: %T \n", i, r, r)
}

輸出如下:

i: 0, rune: 'W', type: int32
i: 1, rune: 'h', type: int32
i: 2, rune: 'a', type: int32
i: 3, rune: 't', type: int32
i: 4, rune: '?', type: int32
i: 5, rune: ' ', type: int32
i: 6, rune: '中', type: int32
i: 9, rune: '文', type: int32
i: 12, rune: '字', type: int32
i: 15, rune: '節(jié)', type: int32
i: 18, rune: '數(shù)', type: int32
i: 21, rune: '多', type: int32

Rune與Byte(字節(jié))

int32的別名是rune,天然適合存儲單個文字符號,為Go所采用的。

rune類型值代表一個UTF-8字符。以字節(jié)(byte)為單位對Unicode碼點(diǎn)作變長編碼?,F(xiàn)在計(jì)算機(jī)都用UTF-8來表示單個字符。

字符串的是由“字符”組成的,字符用單引號包裹起來,如:

var b = 'h'
c := '沖'
fmt.Printf("%d, %q \n", b, b)	// 104, 'h'
fmt.Printf("%d, %q \n", c, c)	// 20914, '沖'

字節(jié),byte類型,底層類型是uint8,由8個bit組成,它可以代表一個ASCII碼。ASCII碼是滿足早期計(jì)算機(jī)的使用的,它用7位表示128個“字符”(ASCII字符):大小寫英文字母、數(shù)字、標(biāo)點(diǎn)符號和設(shè)備控制符。

字符串與字節(jié)slice的轉(zhuǎn)換

字符串底層是一個字節(jié)數(shù)組,所以可以和[]byte類型互換。

s := "abc"
b := []byte(s)
s2 := string(b)

概念上,[]byte(s)轉(zhuǎn)換操作會分配新的字節(jié)數(shù)組,拷貝填入s含有的字節(jié),并生成一個slice的引用,指向整個數(shù)組。反之,用string(b)也會產(chǎn)生一份副本而不是操作真正的b,以此保證上面s2不變。

字符串不可變

字符串是不可變的,表現(xiàn)在其字符串值不可修改。平時我們看到的字符串修改操作、拼接操作并不改變原有的字符串值,而是將操作后生成新的字符串值賦予原來的變量。

s := "left foot"
t := s
s += ", right foot"

盡管字符串創(chuàng)建后,它底層的字節(jié)slice不可變,但是普通的字節(jié)slice是可以隨意改變的。

var a = []byte{'h', 'e', 'l', 'l', 'o'}
fmt.Printf("%p, %[1]q \n", a)	// 0xc00000a098, "hello"
a[4] = ' '
fmt.Printf("%p, %[1]q \n", a)	// 0xc00000a098, "hell "

由于字符串的不可變以及避免頻繁的操作字符串而導(dǎo)致的多次內(nèi)存分配和復(fù)制,可以使用bytes.Buffer類型。

見GOPL的一個例子:

func intsToString(values []int) string {
	var buf bytes.Buffer
	buf.WriteByte('[')
	for i, v := range values {
		if i > 0 {
			buf.WriteString(",")
		}
		fmt.Fprintf(&buf, "%d", v)
	}
	buf.WriteByte(']')
	return buf.String()
}
func main() {
	fmt.Println(intsToString([]int{1, 2, 3})) // [1,2,3]
}

追加ASCII字符可以用writeByte,追加UTF-8編碼的文字符號,最好用WriteRune方法。

基本類型的值都是可比較的

基本類型的值都是可比較的,如布爾值、數(shù)值、字符串等。

數(shù)值的類型轉(zhuǎn)換

很多整型—整型的轉(zhuǎn)換不會引起值的變化,僅告知編譯器如何解讀這么值。但縮減大小的類型轉(zhuǎn)換,以及整型與浮點(diǎn)型的相互轉(zhuǎn)換,會因此值的改變或者損失精度。

浮點(diǎn)型轉(zhuǎn)整型會舍棄小數(shù)部分并向0取整。

var f = 3.526
i := int(f)
fmt.Printf("f: %v, i: %v \n", f, i) // f: 3.526, i: 3 
var i16 = int16(555)
var i8 = int8(i16)
fmt.Printf("i16: %v, i8: %v \n", i16, i8) // i16: 555, i8: 43 

運(yùn)算符

運(yùn)算符降序排列:

* 	/ 	% 	<< 	>> 	& 	&^
+ 	- 	| 	^
==	!=	<	<=	>	>=
&&
||

二元運(yùn)算符分為五大優(yōu)先級。同級別的運(yùn)算符滿足左結(jié)合律,可以用圓括號指定次序。

常量

常量是一種表達(dá)式,保證在編譯階段就計(jì)算出對應(yīng)的值。所有常量本質(zhì)上都屬于基本類型:布爾型、字符串或者數(shù)字。

常量自編譯后,其值恒定不變。

type Integer int
const I Integer = 10
const S string = "important_secret"
const (
	NUM1 = 1
	NUM2 = 2
	NUM3
	NUM4 = 5.5
	STR1 = "STR1"
)
func main() {
	fmt.Printf("I: %v \n", I)
	fmt.Printf("S: %v \n", S)
	fmt.Printf("NUM1: %v \n", NUM1)
	fmt.Printf("NUM2: %v \n", NUM2)
	fmt.Printf("NUM3: %v \n", NUM3)
	fmt.Printf("NUM4: %v \n", NUM4)
	fmt.Printf("STR1: %v \n", STR1)
}

輸出如下:

I: 10
S: important_secret
NUM1: 1
NUM2: 2
NUM3: 2
NUM4: 5.5
STR1: STR1

以上就是go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解的詳細(xì)內(nèi)容,更多關(guān)于go基本數(shù)據(jù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang gorm多條件篩選查詢操作

    golang gorm多條件篩選查詢操作

    這篇文章主要介紹了golang gorm多條件篩選查詢操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang高并發(fā)的深入理解

    golang高并發(fā)的深入理解

    golang從語言級別上對并發(fā)提供了支持,而且在啟動并發(fā)的方式上直接添加了語言級的關(guān)鍵字。下面這篇文章主要給大家介紹了關(guān)于golang高并發(fā)的相關(guān)資料,需要的朋友可以參考下
    2019-03-03
  • golang類型推斷與隱式類型轉(zhuǎn)換

    golang類型推斷與隱式類型轉(zhuǎn)換

    這篇文章主要介紹了golang類型推斷與隱式類型轉(zhuǎn)換,golang類型推斷可以省略類型,像寫動態(tài)語言代碼一樣,讓編程變得更加簡單,同時也保留了靜態(tài)類型的安全性
    2022-06-06
  • Go語言 init函數(shù)的具體使用

    Go語言 init函數(shù)的具體使用

    init()函數(shù)是Go語言中一種特殊的函數(shù),用于在包被導(dǎo)入時執(zhí)行一次性的初始化操作,本文就來介紹一下Go語言 init函數(shù)的具體使用,感興趣的可以了解一下
    2024-09-09
  • Golang中的Interface詳解

    Golang中的Interface詳解

    本文詳細(xì)講解了Golang中的Interface,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 通過Golang實(shí)現(xiàn)無頭瀏覽器截圖

    通過Golang實(shí)現(xiàn)無頭瀏覽器截圖

    在Web開發(fā)中,有時需要對網(wǎng)頁進(jìn)行截圖,以便進(jìn)行頁面預(yù)覽、測試等操作,本文為大家整理了Golang實(shí)現(xiàn)無頭瀏覽器的截圖的方法,感興趣的可以了解一下
    2023-05-05
  • Go的固定時長定時器和周期性時長定時器

    Go的固定時長定時器和周期性時長定時器

    本文主要介紹了Go的固定時長定時器和周期性時長定時器,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Go語言LeetCode500鍵盤行題解示例詳解

    Go語言LeetCode500鍵盤行題解示例詳解

    這篇文章主要為大家介紹了Go語言LeetCode500鍵盤行題解示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn)

    Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn)

    go語言用來執(zhí)行一個系統(tǒng)的命令相對python來說還是有點(diǎn)復(fù)雜的,執(zhí)行命令是一個非常常見的需求,本文主要介紹了Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • golang中連接mysql數(shù)據(jù)庫

    golang中連接mysql數(shù)據(jù)庫

    這篇文章主要介紹了golang中連接mysql數(shù)據(jù)庫的步驟,幫助大家更好的理解和學(xué)習(xí)go語言,感興趣的朋友可以了解下
    2020-12-12

最新評論

徐州市| 嘉义县| 三都| 津南区| 洞头县| 永年县| 堆龙德庆县| 木里| 尚义县| 杭锦后旗| 梨树县| 阜阳市| 桃江县| 鄯善县| 屏东市| 大同县| 卓资县| 诏安县| 女性| 滦平县| 尼勒克县| 突泉县| 炉霍县| 明光市| 罗平县| 五河县| 泸水县| 勐海县| 铜陵市| 子洲县| 望谟县| 万州区| 孝义市| 柳江县| 闽清县| 万山特区| 江达县| 库伦旗| 土默特右旗| 丹阳市| 东明县|