基礎(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
unit8是byte。
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:只有true和false
注意:
(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