欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Golang中常用的基本數(shù)據(jù)類型有哪些

這篇文章主要講解了“Golang中常用的基本數(shù)據(jù)類型有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Golang中常用的基本數(shù)據(jù)類型有哪些”吧!

創(chuàng)新互聯(lián)公司是一家專業(yè)提供安平企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為安平眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

Golang中常用的基本數(shù)據(jù)類型有哪些

Golang 是一種強(qiáng)類型語(yǔ)言,變量使用時(shí)需要進(jìn)行強(qiáng)制類型定義,一旦某一個(gè)變量被定義,如果不經(jīng)強(qiáng)制轉(zhuǎn)換,那么它永遠(yuǎn)就是該類型。

變量聲明及初始化

Golang 推薦使用駝峰式命名,如 QuoteRuneToASCII 和 parseRequestLine 等。

定義變量的幾種形式:

// 第一種,先聲明類型,再進(jìn)行初始化賦值
// 如果沒(méi)有初始化,則變量默認(rèn)為零值。
var a int
a = 3

// 第二種, 根據(jù)賦值自動(dòng)適配類型
b := 3   // 這種寫(xiě)法只能在函數(shù)體中出現(xiàn)
         // 效果等價(jià)于 var b = 3, 但后者可以在函數(shù)體之外的地方使用

// 第三種,聲明類型的同時(shí)進(jìn)行賦值
var c int = 3

// 第四種,使用 new 創(chuàng)建變量,然后返回變量的地址,類型為 *type
p := new(int)
*p = 3

// 與 python 相同,交換兩個(gè)變量的值,可以使用 a, b = b, a 
// 但與 python 不同的是兩個(gè)變量的類型必須是相同的。

注意:

  • Golang 中不允許出現(xiàn)未使用的變量,否則會(huì)報(bào)錯(cuò) a declared and not used。但是全局變量是允許聲明但不使用。

  • Golang 的封裝性由變量名第一個(gè)字母決定,大寫(xiě)字母開(kāi)頭的變量是可導(dǎo)出的變量,可以在包外使用,小寫(xiě)字母或者下劃線開(kāi)頭的變量只能在本包內(nèi)使用。

  • “:=” 是一個(gè)變量聲明語(yǔ)句,而 “=‘ 是一個(gè)變量賦值操作,一行中簡(jiǎn)短聲明多個(gè)變量時(shí),":=" 語(yǔ)句中必須至少要聲明一個(gè)新的變量。

基本數(shù)據(jù)類型

獲取元素類型

// 方法一,創(chuàng)建 reflect 變量
import "reflect"

var a int
typeOfA := reflect.TypeOf(a)
fmt.Println(typeOfA)
// 或者直接 fmt.Println(reflect.TypeOf(a))

// 方法二,使用 fmt 查看
import "fmt"
var a int
fmt.Printf("%T", a)   // 注意不能用 Println

整型

數(shù)字表示類型的比特長(zhǎng)度,不同長(zhǎng)度的類型是獨(dú)立的,混合計(jì)算會(huì)報(bào)錯(cuò)

int 的長(zhǎng)度由硬件決定:

數(shù)據(jù)類型計(jì)算機(jī)架構(gòu)比特寬度字節(jié)寬度
int32位324
int64位648
uint32位324
uint64位648

也可以指定 int 的固定長(zhǎng)度類型:

數(shù)據(jù)類型比特寬度
int88
int1616
int32 (rune, 可以用來(lái)表示一個(gè) Unicode 字符)32
int6464
uint8 (byte)8
uint1616
uint3232
uint6464

浮點(diǎn)類型

Golang 支持兩種浮點(diǎn)型數(shù)值:float32 和 float64??梢允褂?math 包中的常量獲取浮點(diǎn)類型的邊界值

const (
    MaxFloat32             = 3.40282346638528859811704183484516925440e+38  // 2**127 * (2**24 - 1) / 2**23
    SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)

    MaxFloat64             = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52
    SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
)

注意:浮點(diǎn)類型有精度限制,計(jì)算結(jié)果不準(zhǔn)確,不推薦使用
需要進(jìn)行浮點(diǎn)計(jì)算時(shí),可以使用放大 100 倍的整數(shù)計(jì)算,計(jì)算完成再將結(jié)果縮小 100 倍

復(fù)數(shù)

Golang 自帶了復(fù)數(shù)類型,分別為 complex64, complex128,定義時(shí)需要制定實(shí)部和虛部,如:

var c1, c2 complex64
c1 = 1 + 2i
c2 = 2 + 3i
fmt.Println(c1 + c2) // out: 3 + 5i

布爾

bool 類型,有 true 和 false 兩種類型,要注意的是,和 python 不同,Golang 不會(huì)自動(dòng)對(duì)變量識(shí)別 true or false,因此 if 1 這種方式是會(huì)報(bào)錯(cuò)的

錯(cuò)誤

error,error 實(shí)際上是一種接口類型,后續(xù)會(huì)單獨(dú)介紹,可以先參考官網(wǎng)文檔 error document

字符

rune, byte 可用于表示單個(gè)字符,字符串,rune 數(shù)組,byte 數(shù)組之間可以相互轉(zhuǎn)換,讓我們從源碼看看 byte 和 rune 的區(qū)別:

// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8


// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32

可以看出,byte 為 1 字節(jié)的 uint8 數(shù)值,rune 為 4 字節(jié)的 int32 數(shù)值,通過(guò)下面的代碼,可以看出一個(gè)中文字符占了三個(gè)字節(jié),在 []byte{} 中長(zhǎng)度為 3,string 和 []byte{} 的長(zhǎng)度相等,string 實(shí)際上就是由 byte 數(shù)組實(shí)現(xiàn)的。

a := "測(cè)試T"
aRune := []rune(a)
aByte := []byte(a)
fmt.Println(a, aRune, aByte)
fmt.Println(len(a), len(aRune), len(aByte))
  
// output:
// 測(cè)試T [27979 35797 84] [230 181 139 232 175 149 84]
// 7 3 7

字符串

string 類型,與 python 不同,go 的字符串只能用 “” 或者 原始字符串引號(hào) ``(重音符號(hào))

// 普通字符串
s1 := "hello\nworld"    // 里面的 \n 會(huì)被轉(zhuǎn)義為回車

// 原始字符串,相當(dāng)于 python 中在字符串前面加 r
s2 := `hello\nworld`    // 所有內(nèi)容都是字符,不會(huì)被轉(zhuǎn)義

字符串是不可修改的,對(duì)字符串進(jìn)行修改操作時(shí),會(huì)創(chuàng)建一個(gè)新的字符串賦值給當(dāng)前字符串

s := "hello"
s += " world" // 這樣不會(huì)報(bào)錯(cuò),會(huì)把 "hello world" 整個(gè)重新分配給 s

s[0] = "a"    // 這樣寫(xiě)就會(huì)報(bào)錯(cuò)

因此,如果涉及到大批量的字符串拼接或者修改的操作,效率會(huì)很低且耗費(fèi)資源,推薦使用 bytes 包的 Buffer 來(lái)進(jìn)行操作

import "bytes"

bs := bytes.NewBufferString("")
bs.WriteString("hello ")
bs.WriteString("world")
s := bs.String()  // out: hello world

更多內(nèi)容可查看官網(wǎng)文檔 bytes document

字符串常用操作

獲取字符串長(zhǎng)度

字符串本質(zhì)上是字符數(shù)組,所以可以使用 len(s) 獲取長(zhǎng)度。
要注意的是對(duì)用戶名等可能包含中文或其他字符的字符串進(jìn)行判斷時(shí),使用 utf8 長(zhǎng)度判斷而不是 len() 判斷,否則識(shí)別出來(lái)的長(zhǎng)度是不正確的

fmt.Println(len("測(cè)試"))							// 6
fmt.Println(utf8.RuneCountInString("測(cè)試"))			// 2
fmt.Println(utf8.RuneCountInString("混合測(cè)試,fight!"))  // 11

數(shù)值和字符串的相互轉(zhuǎn)換

  • int 轉(zhuǎn)換為 string

int 轉(zhuǎn)換為 string 不能直接 string(i),這樣轉(zhuǎn)完會(huì)變成空值

s := strconv.Itoa(i)
  • int64 轉(zhuǎn)換為 string

var i64 int64s := strconv.FormatInt(i64,10)  // 第二個(gè)參數(shù)為基數(shù)(2~36),如十進(jìn)制二進(jìn)制等
  • string 轉(zhuǎn)換為 int 型

使用非數(shù)值的字符串轉(zhuǎn)換為數(shù)值時(shí)會(huì)發(fā)生錯(cuò)誤,比如 “abc” 轉(zhuǎn)為數(shù)字或者使用空字符串,因此需要接收 error。

i, err := strconv.Atoi(s)
if err != nil {
	return err
}
  • string 轉(zhuǎn)換為 int64

//第二個(gè)參數(shù)為基數(shù)(2~36),
//第三個(gè)參數(shù)位大小表示期望轉(zhuǎn)換的結(jié)果類型,其值可以為0, 8, 16, 32和64,
//分別對(duì)應(yīng) int, int8, int16, int32和int64
i64, err := strconv.ParseInt(s, 10, 64)

string 和 slice 相互轉(zhuǎn)換

  • slice 轉(zhuǎn)換為 string

import "strings"

sli := []string{"111","2222","333","4444"}
ss := strings.Join(s,"--")  // 輸出為 111--2222--333--4444
  • string 轉(zhuǎn)換為 slice

ss := "a,b,c"
sli := strings.Split("a,b,c", ",")

字符串替換

使用 strings 包的 Replace 函數(shù)進(jìn)行字符串替換

// Replace
// 如果最后一個(gè)參數(shù)為正整數(shù),表示將前 n 個(gè) old 替換為 new
// 如果最后一個(gè)參數(shù)為負(fù)數(shù),一般為-1,表示全局替換,相當(dāng)于 ReplaceAll
func Replace(s, old, new string, n int) string
// 例:
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
// output: moo moo moo
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", 2))
// output: moo moo oink

// ReplaceAll
func ReplaceAll(s, old, new string) string

指針

如果用“var x int”聲明語(yǔ)句聲明一個(gè)x變量,那么 &x表達(dá)式(取x變量的內(nèi)存地址)將產(chǎn)生一個(gè)指向該整數(shù)變量的指針,指針對(duì)應(yīng)的數(shù)據(jù)類型是 *int ,指針被稱之為“指向int類型的指針”。同時(shí) *p表達(dá)式對(duì)應(yīng)p指針指向的變量的值。

x := 1
p := &x     // p 為指向 x 的指針   
/* 等價(jià)于:
var p *int
p = &x
*/
fmt.Println(*p)   // 輸出 1
*p = 2     // 修改 *p 指向?qū)ο蟮闹?
fmt.Println(x)   // 輸出 2

任何類型的指針的零值都是 nil。如果 p != nil測(cè)試為真,那么 p 是指向某個(gè)有效變量。指針之間也是可以進(jìn)行相等測(cè)試的,只有當(dāng)它們指向同一個(gè)變量或全部是nil時(shí)才相等。

自定義類型

type 類型名字 底層類型

這種操作的意義在于賦予相同基本類型(比如 float64)的變量不同的含義,比如華氏溫度和攝氏溫度,這兩種溫度被定義成不同的數(shù)據(jù)類型,可以避免混用不同的溫度單位,產(chǎn)生錯(cuò)誤的計(jì)算結(jié)果。

// Package tempconv performs Celsius and Fahrenheit temperature computations.
package tempconv
import "fmt"

type Celsius float64 // 攝氏溫度
type Fahrenheit float64 // 華氏溫度

const (
    AbsoluteZeroC Celsius = -273.15 // 絕對(duì)零度
    FreezingC Celsius = 0 // 結(jié)冰點(diǎn)溫度
    BoilingC Celsius = 100 // 沸水溫度
)

func CToF(c Celsius) Fahrenheit { 
    return Fahrenheit(c*9/5 + 32) 
}

func FToC(f Fahrenheit) Celsius { 
    return Celsius((f - 32) * 5 / 9) 
}

常量

go 使用 const創(chuàng)建常量,它們?cè)诰幾g時(shí)被創(chuàng)建,只能是數(shù)字、字符串或布爾
值。

// 常量用的是 = 而不是 :=
const x = 42

可以使用 iota生成枚舉值,第一個(gè)iota 表示為0,當(dāng)iota 再次在新的一行使用時(shí),它的值累加 1。第一行之外的 = iota 可以省略,只要出現(xiàn)了一次 iota, 當(dāng)前 const 結(jié)構(gòu)中后面每一行 iota的值加1。

package main

import "fmt"

func main() {
    const (
        a = iota  // 0
        b		 // 1
        c		 // 2
        d = "ha"  // "ha", iota += 1, iota = 3
        e		 // "ha", iota += 1, iota = 4
        f = 100   // 100, iota += 1, iota = 5
        g		 // 100, iota += 1, iota = 6
        h = iota  // 7
        i		 // 8
    )
    
    fmt.Println(a,b,c,d,e,f,g,h,i)
    // 結(jié)果為 0 1 2 ha ha 100 100 7 8
    
    // 另一個(gè)有趣的示例
    const (
        x = 1 << iota  // 1 << 0
        y = 3 << iota  // 3 << 1
        z			  // 3 << 2
        q			  // 3 << 3
    )
    
    fmt.Println(x,y,z,q)
    // 結(jié)果為 1 6 12 24
}

格式化輸出

使用 fmt 包進(jìn)行格式化輸出,可參考鏈接
格式化輸出方式

強(qiáng)制類型轉(zhuǎn)換

type_name(expression)
// 如 
f := float32(3)
i := int64(2)

注意:將長(zhǎng)類型強(qiáng)制轉(zhuǎn)換為短類型時(shí)會(huì)發(fā)生截?cái)?/p>

感謝各位的閱讀,以上就是“Golang中常用的基本數(shù)據(jù)類型有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Golang中常用的基本數(shù)據(jù)類型有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文標(biāo)題:Golang中常用的基本數(shù)據(jù)類型有哪些
分享鏈接:http://chinadenli.net/article32/pddipc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站維護(hù)、外貿(mào)建站、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)