在 Go 編程語言中,數據類型用於聲明函數和變量。
數據類型的出現是爲了把數據分成所需內存大小不同的類型,編程的時候需要用大數據的時候才需要申請大內存,使內存利用更充分
package main
import (
"fmt"
"reflect"
)
func main() {
/* 布爾型 */
var tBool bool = true // 布爾型
/* 字符型 */
var tString string = "犀利的大熊" // 字符串 一串固定長度的字符連接起來的字符序列
/* 數字型 */
var tInt int = 1 // 整型
var tFloat32 float32 = 1.21 // 32位浮點型
var tFloat64 float64 = 1.21 // 64位浮點型 比32位有更高的精度 推薦使用64位
/* 派生類型 */
var str string = "犀利的大熊"
var tPointer *string = &str // 指針類型 每個變量都擁有內存地址,指針的值就是內存地址 &爲取地址操作
var tArray = [2]int{1, 2} // 數組類型,是一個可以容納若干類型相同的元素的容器。這個容器的大小(即數組的長度)是固定的
var tArray1 = [...]int{1, 2, 2, 3} // 這種定義方法可以免除定義長度的操作 會根據元素個數直接定義長度
// 結構體是由成員構成的複合類型。Go 語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各種屬性
type Student struct {
name string // 私有成員(對外不可見)
age int
Class string // 首字母大寫則該成員爲公有成員(對外可見)
}
// go oop實現方式
var tStruct = Student{name: "犀利的大熊", age: 18, Class: "三年級二班"}
var tChannel = make(chan int) // 無緩衝阻塞讀寫channel類型 後續講解
var tChannel1 = make(chan int, 2) // 有緩衝、非阻塞,寫滿 2個元素才阻塞寫入channel類型 後續講解
// 函數類型,在Go中函數也是一種變量,我們可以通過type來定義它,它的類型就是所有擁有相同的參數,相同的返回值的一種類型
type tFunction func(a int, b int) int
// 切片類型,方便使用者處理類型數據序列。 切片有點像其他語言中的數組,並且提供了一些額外的屬性
// 定義一個切片和定義一個數組的語法相似,唯一的不同是不需要定義切片長度
var tSlice = []string{"犀利的", "大熊"}
// 接口類型是其他類型行爲的概括與抽象。接口是一種抽象類型
// 接口命令習慣以er結尾 接口只有方法聲明,沒有實現,沒有數據字段
//接口可以匿名嵌入其他接口,或嵌入到結構中
type tInterface interface {
sayHelloWorld()
}
// Map 是一種無序的鍵值對的集合。Map 最重要的一點是通過 key 來快速檢索數據,key 類似於索引,指向數據的值。
//Map 是一種集合,所以我們可以像迭代數組和切片那樣迭代它。不過,Map 是無序的,我們無法決定它的返回順序,這是因爲 Map 是使用 hash 表來實現的
var tMap map[string]string
tMap = make(map[string]string)
tMap["name"] = "犀利的大熊"
fmt.Println(reflect.TypeOf(tBool)) // 類型輸出 bool
fmt.Println(reflect.TypeOf(tString)) // 類型輸出 string
fmt.Println(reflect.TypeOf(tInt)) // 類型輸出 int
fmt.Println(reflect.TypeOf(tFloat32)) // 類型輸出 float32
fmt.Println(reflect.TypeOf(tFloat64)) // 類型輸出 float64
fmt.Println(reflect.TypeOf(str)) // 類型輸出 string
fmt.Println(reflect.TypeOf(tPointer)) // 類型輸出 *string
fmt.Println(reflect.TypeOf(tArray)) // 類型輸出 [2]int
fmt.Println(reflect.TypeOf(tArray1)) // 類型輸出 [4]int
fmt.Println(reflect.TypeOf(tStruct)) // 類型輸出 main.Student
fmt.Println(reflect.TypeOf(tChannel)) // 類型輸出 chan int
fmt.Println(reflect.TypeOf(tChannel1)) // 類型輸出 chan int
fmt.Println(reflect.TypeOf(tSlice)) // 類型輸出 []string
fmt.Println(reflect.TypeOf(tMap["name"])) // 類型輸出 string
}