1. 程式人生 > 程式設計 >Golang入門2-資料型別

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)
}
複製程式碼

獲取變數型別

studygolang.com/articles/10…

參考

官網: docscn.studygolang.com/ref/spec#St…

GCTT出品 Go系列教程 —— 14. 字串: mp.weixin.qq.com/s/lneAvSuJn…

golang數字轉字串方法: blog.csdn.net/wangzhezhil…