Golang——基礎(chǔ)數(shù)據(jù)類型

基礎(chǔ)數(shù)據(jù)類型:

  • 整型:byte、int、int8、int16、int32、int64、unit、uint16、uint3、uint64等
  • 浮點(diǎn)型:float32、float64
  • 復(fù)數(shù)類型:complex64、complex128
  • 布爾類型:bool
  • 字符串:string
  • 字符類型:rune
  • 錯(cuò)誤類型:error

復(fù)合數(shù)據(jù)類型:

  • 指針(pointer)
  • 數(shù)組(array)
  • 切片(slice)
  • 字典(map)
  • 通道(channel)
  • 結(jié)構(gòu)體(struct)
  • 接口(interface)

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

整型

有符號(hào):int8 int16 int32 int64
無(wú)符號(hào):unit8 uint16 uint32 uint64

unit8byte。

int16對(duì)應(yīng)c語(yǔ)言中的short型 ,int64對(duì)應(yīng)c語(yǔ)言中的long型。

int:自動(dòng)匹配os,os是32位就是int32,os是64位就是int64。

len():獲取對(duì)象的長(zhǎng)度,返回int

package main

import "fmt"

func main() {
        //十進(jìn)制
    var a int = 10
    fmt.Printf("%d \n", a)   //10
    fmt.Printf("%b \n", a)   //1010  占位符%b表示二進(jìn)制

    //八進(jìn)制
    var b int= 077
        fmt.Printf("%d \n", b)   //63
    fmt.Printf("%o \n", b)   //77

    //十六進(jìn)制
    var c int= 0xff
    fmt.Printf("%x \n", c)   //ff
    fmt.Printf("%X \n", c)   //FF

    //變量的內(nèi)存地址
    fmt.Printf("%p \n", &a)  //0xc000014080 
}

math.Nan(),跟誰(shuí)(包括自己)都不相等

浮點(diǎn)型

遵循IEEE 754標(biāo)準(zhǔn)
float32 :最大范圍為3.4e38,用常量math.MaxFloat32
float64:最大范圍為1.8e308,用常量math.MaxFloat64
float32的有效bit位只有23個(gè),其它的bit位用于指數(shù)和符號(hào);當(dāng)大于23bit能表達(dá)的范圍時(shí),float32表示將會(huì)出現(xiàn)誤差。

package main

import (
    "fmt"
    "math"
)

func main() {
    var a float32 = 2.34
    fmt.Printf("%f \n", a)           //2.340000
    fmt.Printf("%f \n", math.Pi)     //3.141593
    fmt.Printf("%0.2f \n", math.Pi)  //3.14
}

復(fù)數(shù)類型

complex64 : 實(shí)部和虛部分別是32位
complex128 : 實(shí)部和虛部分別是64位

package main

import "fmt"

func main() {
    var c1 complex64
    c1 = 1 + 2i
    fmt.Println(c1)     //(1+2i)
    var c2 complex128
    c2 = 3 + 4i
    fmt.Println(c2)     //(3+4i)
}

布爾類型

bool:只有truefalse
注意:
(1)默認(rèn)值是false;
(2)不允許將整型強(qiáng)制轉(zhuǎn)為布爾型;
(3)不參與數(shù)值運(yùn)算,不與其它類型進(jìn)行轉(zhuǎn)換;

package main

import "fmt"

func main() {
    var b bool
    b = 1         //編譯報(bào)錯(cuò)
    b = bool(1)   //編譯報(bào)錯(cuò)

    var bb bool
    fmt.Println(bb)
    bb = true
    fmt.Println(bb)
    bb = (1 == 0)  //編譯正確
    fmt.Println(bb)
}

字符串

內(nèi)部實(shí)現(xiàn)使用UTF-8編碼,用雙引號(hào)("")

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

轉(zhuǎn)移字符(\)
\r \n \t ' " \

var s string = "str = \"c:\\users\\temp\""
fmt.Println(s)    //str = "c:\users\temp"

多行字符串,用反引號(hào)(``)
反引號(hào)間換行認(rèn)為字符串中的換行;但是反引號(hào)間所有的轉(zhuǎn)義字符均無(wú)效,文本按照原樣輸出

var multiStr  = `這是
多
"不需要轉(zhuǎn)移"
行
`

常用方法
求長(zhǎng)度:len(str)
拼接字符串:+或者fmt.Sprintf
分割:string.Split
判斷是否包含:strings.Contains
前綴/后綴判斷:strings.HasPrefix,strings.HasSuffix
字串出現(xiàn)的位置:strings.Index(),strings.LastIndex
合并操作:strings.Join(a[] string, sep string)

package main

import "fmt"
import "strings"

func main() {
    s1 := "Hello "
    //求長(zhǎng)度
    fmt.Println(len(s1))   //6

    //連接
    s2 := "Go"
    // s3 := s1 + s2
    s3 := fmt.Sprintf("%s----%s", s1, s2)
    fmt.Println(s3)   //Hello ----Go

    //分割
    s4 := strings.Split("Hello Ha Hwx", "H")
    fmt.Println(s4)   //[ ello  a  wx]

    
    s5 := "Hello haha"
    //是否包含
    fmt.Println(strings.Contains(s5, "Ha"))   //false
    //判斷前綴
    fmt.Println(strings.HasPrefix(s5, "He"))  //true
    //判斷后綴
    fmt.Println(strings.HasSuffix(s5, "ha"))  //true

    //字串出現(xiàn)位置
    s6 := "Hello Apple App"
    fmt.Println(strings.Index(s6, "App"))      //6
    fmt.Println(strings.LastIndex(s6, "App"))  //12

    //合并
    s7 := []string{"a", "b", "c", "d"}
    fmt.Println(strings.Join(s7, "-"))      //a-b-c-d

}

字符類型:byte和rune類型

字符有兩種:
(1)uint8類型,或者叫byte型,代表了ASCII碼的一個(gè)字符;
(2)rune類型,代表一個(gè)UTF-8字符;

當(dāng)需要出來(lái)中文、日文或其它復(fù)合字符時(shí),需要用到rune類型。rune類型實(shí)際是一個(gè)int32,通過(guò)reflect.Type可看到。

在類型推導(dǎo)時(shí)候,默認(rèn)是rune類型。byte類型需要強(qiáng)制轉(zhuǎn)換。

package main

import "fmt"

func main() {
    s1 := "Golang"
    c1 := 'G' //1個(gè)字節(jié)(8位)
    fmt.Println(s1, c1)   //Golang 71
    fmt.Printf("%c", c1)   //Golang G

    s2 := "中國(guó)"
    c2 := '中'  //UTF-8編碼下一個(gè)中文是3個(gè)字節(jié)
    fmt.Println(s2, c2)   //中國(guó) 20013

    s3 := "hello冬雪"
    fmt.Println(len(s3))    //11

    //遍歷字符串
    for i := 0; i < len(s3); i++{
        fmt.Printf("%c\n", s3[i])   //都成亂碼了
    }

    //for range循環(huán),按照rune類型去遍歷
    for k,v := range s3{
        fmt.Printf("%d - %c\n", k, v)
    }
    // 0 - h
    // 1 - e
    // 2 - l
    // 3 - l
    // 4 - o
    // 5 - 冬
    // 8 - 雪

}

修改字符串

字符串是值類型,賦值之后不可修改
要修改字符串,需要先將其轉(zhuǎn)換成[]rune[]byte,完成后再轉(zhuǎn)換為string。無(wú)論哪種轉(zhuǎn)換,都會(huì)從新分配內(nèi)存,并復(fù)制字節(jié)數(shù)組。

s1 := "small"
byteS1 := []byte(s1)
byteS1[0] = 'a'
fmt.Println(s1,string(byteS1))  //small amall

s2 := "冬雪"
runeS2 := []rune(s2)
runeS2[1] = '冬'
fmt.Println(s2,string(runeS2))  //冬雪 冬冬

類型轉(zhuǎn)換

只有強(qiáng)制類型轉(zhuǎn)換,沒(méi)有隱式轉(zhuǎn)換。

T(表達(dá)式)

T是要轉(zhuǎn)換的類型。
表達(dá)式包括變量、復(fù)雜算子和函數(shù)返回值等。

s1 := "small"
byteS1 := []byte(s1)
byteS1[0] = 'a'
fmt.Println(s1,string(byteS1))  //small amall
//強(qiáng)制類型轉(zhuǎn)換
s1 = string(byteS1)
fmt.Println(s1)  //amall

類型轉(zhuǎn)換包strconv

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容