Golang入門2-資料型別
環境: go1.11.2 linux/amd64(Ubuntu 18.04)
注:本文內容主要來自Golang中文社群
mp.weixin.qq.com/s/xmV3yWsDc…
mp.weixin.qq.com/s/h2mV1zZ_C…
前菜
因為資料型別跟變數息息相關,所以這裡會先講述Golang變數的幾種宣告方式。
1.var name type 比如 var i int, 表示宣告瞭一個int型別的變數,名字為 i。這時候只是宣告,並沒有賦值,如果變數沒有賦值,Go會自動進行賦值,而int型別的預設值為0。
2.var name type = value 第一種方式的進化,在宣告變數的時候便賦予了初始值
3.var name = value(型別推斷) 比如 int i = 8, 此時雖然沒有宣告i的型別,但是Go會自動識別 i 的型別
4.var name1, name2 type = value1, value2 宣告多個變數
5.name := value(簡短宣告) 這是Golang的一種典型宣告方式, 例如 i := 1。這種方式有三個要求,一是要求左邊的變數必須被賦值,二是要求左邊變數至少有一個是尚未宣告的,三是這種方式只支援函式體內使用,其他範圍必須用var
// 左邊的變數必須被賦值
func main(){
name,age := "your name" // assignment mismatch: 2 variable but 1 values
fmt.Println("my name is",name,"age",age)
}
// 左邊變數至少有一個是尚未宣告的
func main(){
a,b := 20,30
fmt.Println("a is ",a,"b is",b)
// 因為c未宣告,所以執行成功
b,c := 40,50
fmt.Println("b is ",b,"c is",c)
}
複製程式碼
在Golang中,公有變數和私有變數也值得注意,其中,首字母大寫的變數(包括函式)是公有變數,可以被其他模組引用; 首字母小寫的變數是私有變數,只能在本模組引用
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi) // 3.141592653589793
}
// 錯誤示範
func main() {
fmt.Println(math.pi) // cannot refer to unexported name math.pi
}
複製程式碼
正餐
Golang有非常多的型別,這裡只會涉及到 數字型別 和 字串型別。
數字型別
Go的數字型別有很多,具體有以下型別:
- int8,int16,int32,int64,int
- uint8,uint16,uint32,uint64,uint
- float32,float64
- complex64,complex128
- byte
- rune
有符號整型
int8:表示 8 位有符號整型(00000000 ~ 11111111,第一位是符號位)
大小:8 位
範圍:-128~127
int16:表示 16 位有符號整型
大小:16 位
範圍:-32768~32767
int32:表示 32 位有符號整型
大小:32 位
範圍:-2147483648~2147483647
int64:表示 64 位有符號整型
大小:64 位
範圍:-9223372036854775808~9223372036854775807
int:根據不同的底層平臺自動選擇 32 或 64 位整型。除非對整型的大小有特定的需求,否則你通常應該使用 int 表示整型。
無符號整型
uint8:表示 8 位無符號整型
大小:8 位
範圍:0~255
uint16:表示 16 位無符號整型
大小:16 位
範圍:0~65535
uint32:表示 32 位無符號整型
大小:32 位
範圍:0~4294967295
uint64:表示 64 位無符號整型
大小:64 位
範圍:0~18446744073709551615
uint:根據不同的底層平臺,選擇 32 或 64 位無符號整型。
大小:在 32 位系統下是 32 位,而在 64 位系統下是 64 位。
範圍:在 32 位系統下是 0~4294967295,而在 64 位系統是 0~18446744073709551615。
浮點型
float32:32 位浮點數
float64:64 位浮點數
複數型別
complex64:實部和虛部都是 float32 型別的的複數。
complex128:實部和虛部都是 float64 型別的的複數。
複數型別的實部和虛部應該是相同型別,也就是 float32 或 float64。
如果實部和虛部都是 float32 型別,則函式會返回一個 complex64 型別的複數。如果實部和虛部都是 float64 型別,則函式會返回一個 complex128 型別的複數。
其他數字型別
byte 是 uint8 的別名。建立這個型別是為了區分傳過來的引數是位型別還是數字型別
rune 是 int32 的別名。
nil: pointer,channel,func,interface,map,or slice 型別的0值,也只能用於這些型別
package main
import (
"fmt"
"unsafe"
)
func main() {
// unsafe.Sizeof用於檢視變數的位元組數
var a uint8 = 124
var b uint16 = 124
var c uint32 = 124
var d uint64 = 124
var e int = 2147483649
var g int8 = 124
// var f int8 = -156 // 這樣賦值會報錯,因為int8的範圍是-128~127,所以賦值為-156會溢位
var i int16 = 124
var k int32 = 124
fmt.Println("sizea:",unsafe.Sizeof(a)) // 佔1個位元組
fmt.Println("sizeb:",unsafe.Sizeof(b)) // 2
fmt.Println("size:",unsafe.Sizeof(c)) // 4
fmt.Println("size:",unsafe.Sizeof(d)) // 8
fmt.Println("size:",unsafe.Sizeof(e)) // 我的機器是64位,所以是8位元組
//fmt.Println("size:",unsafe.Sizeof(f)) // 1
fmt.Println("size:",unsafe.Sizeof(g)) // 1
fmt.Println("size:",unsafe.Sizeof(i)) // 2
fmt.Println("size:",unsafe.Sizeof(k)) // 4
}
複製程式碼
字串型別
由於和其他語言相比,字串在 Go 語言中有著自己特殊的實現,主要有以下幾個特點。
- 1.字串是位元組的集合。
- 2.單引號和雙引號代表的意義不同, 單引號是rune型別,雙引號才是字串型別。
- 3.Go 中的字串是相容 Unicode 編碼的,並且使用 UTF-8 進行編碼。
獲取字串長度的幾種方法:
- 使用 bytes.Count() 統計
- 使用 strings.Count() 統計
- 將字串轉換為 []rune 後呼叫 len 函式進行統計
- 使用 utf8.RuneCountInString() 統計
str:="HelloWord"
l1:=len([]rune(str))
l2:=bytes.Count([]byte(str),nil)-1)
l3:=strings.Count(str,"")-1
l4:=utf8.RuneCountInString(str)
複製程式碼
單引號和雙引號的區別?
在Go中,雙引號是用來表示字串string,其實質是一個byte型別的陣列。單引號表示rune型別。還有一個反引號, 支援多行文字,但不支援轉義。
字串的格式化
studygolang.com/articles/10…
型別轉換
// 1.數字型別轉字串型別主要有三種方法: fmt.Sprint、strconv.Itoa和strconv.FormatInt。
// 其中, fmt.Sprintf效率是最低的, 由於strconv.Itoa封裝了strconv.FormatInt, 所以效率在第二位, strconv.FormatInt效率最高。
// uint32 to string
var n uint32 = 42
string := fmt.Sprint(n)
var n uint32 = 42
string := strconv.FormatUint(uint64(n),10)
// int to string
string := strconv.Itoa(int)
// int64 to string
string := strconv.FormatInt(int64,10)
// string to int
i,err := strconv.Atoi(str)
if err == nil {
  fmt.Printf(“i: %v\n”,i)
}
// string to int64
i64,err := strconv.ParseInt(str,10,64)
if err == nil {
  fmt.Printf(“i64: %v\n”,i64)
}
複製程式碼
獲取變數型別
參考
官網: docscn.studygolang.com/ref/spec#St…
GCTT出品 Go系列教程 —— 14. 字串: mp.weixin.qq.com/s/lneAvSuJn…
golang數字轉字串方法: blog.csdn.net/wangzhezhil…