本篇文章深入探討了 Go 語(yǔ)言中類(lèi)型確定值、類(lèi)型不確定值以及對(duì)應(yīng)類(lèi)型轉(zhuǎn)換的知識(shí)點(diǎn),后續(xù)充分解析了常量與變量及其高級(jí)用法,并舉出豐富的案例。
關(guān)注公眾號(hào)【TechLeadCloud】,分享互聯(lián)網(wǎng)架構(gòu)、云服務(wù)技術(shù)的全維度知識(shí)。作者擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗(yàn)、團(tuán)隊(duì)管理經(jīng)驗(yàn),同濟(jì)本復(fù)旦碩,復(fù)旦機(jī)器人智能實(shí)驗(yàn)室成員,阿里云認(rèn)證的資深架構(gòu)師,項(xiàng)目管理專(zhuān)業(yè)人士,上億營(yíng)收AI產(chǎn)品研發(fā)負(fù)責(zé)人。
一、類(lèi)型確定值
類(lèi)型確定值是與特定數(shù)據(jù)類(lèi)型明確綁定的。類(lèi)型確定值在 Go 中占有很大一部分領(lǐng)域,包括但不限于常量、變量、函數(shù)返回值、結(jié)構(gòu)體字段等。下面是對(duì)類(lèi)型確定值的的示例:
類(lèi)型確定值在變量聲明中
當(dāng)你在變量聲明中明確指定了類(lèi)型,那么這個(gè)變量就是類(lèi)型確定值。
var x int = 10 // x 是類(lèi)型確定值,類(lèi)型為 int
var y string = "Hello" // y 是類(lèi)型確定值,類(lèi)型為 string
類(lèi)型確定值在函數(shù)返回值中
函數(shù)也可以返回類(lèi)型確定值。
func sum(a int, b int) int { // 返回值類(lèi)型明確為 int
return a + b
}
類(lèi)型確定值在結(jié)構(gòu)體字段中
結(jié)構(gòu)體字段也是類(lèi)型確定值。
type Person struct {
Name string // Name 是類(lèi)型確定值,類(lèi)型為 string
Age int // Age 是類(lèi)型確定值,類(lèi)型為 int
}
類(lèi)型確定值在數(shù)組和切片中
數(shù)組和切片的元素也是類(lèi)型確定值。
var arr [3]int = [3]int{1, 2, 3} // arr 是類(lèi)型確定值,類(lèi)型為 [3]int
var s []string = []string{"a", "b", "c"} // s 是類(lèi)型確定值,類(lèi)型為 []string
類(lèi)型確定值在接口和類(lèi)型斷言中
當(dāng)你通過(guò)類(lèi)型斷言將接口值轉(zhuǎn)換為某個(gè)具體類(lèi)型時(shí),結(jié)果是類(lèi)型確定值。
var i interface{} = "this is string"
str, ok := i.(string) // str 是類(lèi)型確定值,類(lèi)型為 string
類(lèi)型確定值在類(lèi)型別名和自定義類(lèi)型中
即使你創(chuàng)建了一個(gè)類(lèi)型別名或自定義類(lèi)型,實(shí)際上還是與原始類(lèi)型綁定的類(lèi)型確定值。
type Length int
var l Length = 10 // l 是類(lèi)型確定值,類(lèi)型為 Length
這些例子展示了類(lèi)型確定值如何滲透到 Go 語(yǔ)言的各個(gè)方面,為開(kāi)發(fā)者提供了嚴(yán)格的類(lèi)型安全性。在編寫(xiě)代碼時(shí),對(duì)類(lèi)型有明確的了解可以幫助你編寫(xiě)更健壯、更安全的程序。
二、類(lèi)型不確定值
類(lèi)型不確定值是沒(méi)有明確類(lèi)型的值。這些值不是與任何具體的數(shù)據(jù)類(lèi)型綁定的,因此在編譯時(shí),Go 編譯器會(huì)根據(jù)上下文來(lái)推斷其類(lèi)型。在 Go 中,類(lèi)型不確定值是一個(gè)相當(dāng)有趣和多面性的概念。這些值存在于常量聲明、算術(shù)運(yùn)算、以及一些內(nèi)建函數(shù)中。下面是對(duì)類(lèi)型不確定值的的示例:
在算術(shù)運(yùn)算中的類(lèi)型不確定值
當(dāng)你使用類(lèi)型不確定值進(jìn)行算術(shù)運(yùn)算時(shí),結(jié)果也是類(lèi)型不確定值,除非運(yùn)算中有一個(gè)類(lèi)型確定值,這種情況下,結(jié)果將是類(lèi)型確定值。
const c = 3 // 類(lèi)型不確定值
var d int = 2 // 類(lèi)型確定值
// e 依然是類(lèi)型不確定值,因?yàn)閰⑴c運(yùn)算的兩個(gè)值都是類(lèi)型不確定值
const e = c * c
// f 是類(lèi)型確定值,因?yàn)閰⑴c運(yùn)算的有一個(gè)類(lèi)型確定值
var f = c * d
在內(nèi)建函數(shù)中的類(lèi)型不確定值
一些 Go 的內(nèi)建函數(shù)(如 len
)返回類(lèi)型不確定值。
const s = "hello world"
const l = len(s) // l 是類(lèi)型不確定值
類(lèi)型不確定值與默認(rèn)類(lèi)型
每個(gè)類(lèi)型不確定值都有一個(gè)與之關(guān)聯(lián)的默認(rèn)類(lèi)型,通常是基于字面量或者運(yùn)算表達(dá)式。
const g = 42.0 // 默認(rèn)類(lèi)型是 float64
const h = 'x' // 默認(rèn)類(lèi)型是 rune
類(lèi)型不確定值在數(shù)組長(zhǎng)度聲明中
在數(shù)組長(zhǎng)度聲明中也可使用類(lèi)型不確定值。
const size = 4
var arr [size]int // 編譯器推斷 size 為 int
類(lèi)型不確定值與 iota
iota
也是類(lèi)型不確定值,經(jīng)常用于枚舉。
const (
zero = iota // zero 是 0
one // one 是 1
)
三、顯式類(lèi)型轉(zhuǎn)換與類(lèi)型推斷
在 Go 語(yǔ)言中,類(lèi)型轉(zhuǎn)換和類(lèi)型推斷是兩個(gè)相當(dāng)重要的概念。它們共同定義了如何在編譯和運(yùn)行時(shí)處理不同類(lèi)型的值。我們將詳細(xì)討論這兩個(gè)概念,并通過(guò)示例來(lái)闡明其用法和重要性。
顯式類(lèi)型轉(zhuǎn)換
顯式類(lèi)型轉(zhuǎn)換是通過(guò)語(yǔ)法明確地將一個(gè)數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類(lèi)型的操作。
定義
在 Go 中,顯式類(lèi)型轉(zhuǎn)換的語(yǔ)法是 T(v)
,其中 T
是目標(biāo)類(lèi)型,而 v
是要轉(zhuǎn)換的值。
var x float64 = 42.0
var y int = int(x) // 顯式地將 float64 轉(zhuǎn)換為 int
限制與約束
顯式類(lèi)型轉(zhuǎn)換并不總是有效的。轉(zhuǎn)換的合法性取決于源類(lèi)型和目標(biāo)類(lèi)型。例如,不能直接將一個(gè)結(jié)構(gòu)體類(lèi)型轉(zhuǎn)換為整數(shù)或者浮點(diǎn)數(shù)。
type myStruct struct {
field int
}
var a myStruct
// var b int = int(a) // 這是不合法的
類(lèi)型推斷
類(lèi)型推斷是編譯器自動(dòng)推斷變量類(lèi)型的過(guò)程。在 Go 中,這通常發(fā)生在使用 :=
進(jìn)行變量初始化時(shí)。
定義
當(dāng)使用 :=
操作符聲明變量但沒(méi)有明確指定類(lèi)型時(shí),Go 編譯器會(huì)根據(jù)右側(cè)表達(dá)式的類(lèi)型來(lái)推斷變量的類(lèi)型。
z := 42 // 類(lèi)型被推斷為 int
在復(fù)雜表達(dá)式中的類(lèi)型推斷
在涉及多種類(lèi)型的復(fù)雜表達(dá)式中,Go 會(huì)盡量進(jìn)行類(lèi)型推斷以滿(mǎn)足表達(dá)式的類(lèi)型需要。
var m float64 = 3.14
n := int(m) + 42 // int(m) 顯式轉(zhuǎn)換,結(jié)果類(lèi)型推斷為 int
類(lèi)型推斷與類(lèi)型不確定值
類(lèi)型推斷也適用于類(lèi)型不確定值。編譯器會(huì)根據(jù)上下文來(lái)推斷其最合適的類(lèi)型。
const p = 5 // 類(lèi)型不確定值
var q = p // 類(lèi)型推斷為 int,因?yàn)?p 的默認(rèn)類(lèi)型是 int
四、常量
在 Go 語(yǔ)言中,常量(Constant)是不可改變的值,這一點(diǎn)與變量有明顯區(qū)別。一旦一個(gè)常量被定義,它的值就不能再被改變。常量可以是類(lèi)型不確定值或類(lèi)型確定值。
類(lèi)型不確定常量
類(lèi)型不確定常量是沒(méi)有明確類(lèi)型的常量。這些常量不是與任何具體的數(shù)據(jù)類(lèi)型綁定的,因此在編譯時(shí),Go 編譯器會(huì)根據(jù)上下文來(lái)推斷其類(lèi)型。
const a = 42 // a 是類(lèi)型不確定值,因?yàn)闆](méi)有明確指定類(lèi)型
類(lèi)型確定常量
類(lèi)型確定常量是與特定數(shù)據(jù)類(lèi)型明確綁定的常量。
const c int = 42 // c 是類(lèi)型確定值,因?yàn)槠漕?lèi)型明確為 int
常量聲明中的自動(dòng)補(bǔ)全
在常量聲明塊中,你可以省略后續(xù)常量的類(lèi)型和值,它們會(huì)自動(dòng)補(bǔ)全。
const (
x int = 10
y // y 也是 int 類(lèi)型,值為 10
)
使用 iota 在常量聲明中
iota
是一個(gè)特殊的常量生成器,主要用于創(chuàng)建一組遞增的整數(shù)常量。
const (
zero = iota // zero 的值為 0
one // one 的值為 1
two // two 的值為 2
)
常量的可見(jiàn)性和可尋址性
常量可以是導(dǎo)出或非導(dǎo)出的,取決于它的名稱(chēng)是否以大寫(xiě)字母開(kāi)頭。常量不是可尋址的。
const ExportedConst = "I am visible" // 可導(dǎo)出的常量
const unExportedConst = "I am not visible" // 不可導(dǎo)出的常量
常量溢出和默認(rèn)類(lèi)型
一個(gè)類(lèi)型不確定常量所表示的值可能會(huì)溢出其默認(rèn)類(lèi)型。在這種情況下,只有當(dāng)這個(gè)常量被用于一個(gè)可以容納該值的上下文時(shí),編譯才會(huì)成功。
const big = 1 << 100 // 默認(rèn)類(lèi)型為 int,但值會(huì)溢出
var bigInt = big >> 99 // big 被用于一個(gè) int64 上下文,沒(méi)有溢出
字符串常量
字符串常量是包含在雙引號(hào)中的一系列字符。
const hello = "Hello, world!"
布爾常量
布爾常量只有兩個(gè)可能的值:true
和 false
。
const flagTrue = true
const flagFalse = false
枚舉常量
通過(guò)使用 iota
,你可以創(chuàng)建一組遞增的整數(shù)常量,通常用于枚舉。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
// ...
Saturday
)
復(fù)數(shù)常量
Go 支持復(fù)數(shù)類(lèi)型,并且你可以創(chuàng)建復(fù)數(shù)常量。
const complexConst = 1 + 2i
強(qiáng)制類(lèi)型轉(zhuǎn)換
你可以通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換將一個(gè)常量轉(zhuǎn)換為另一種類(lèi)型。
const integer = 42
const floatType = float32(integer)
計(jì)算表達(dá)式中的常量
常量也可以是計(jì)算表達(dá)式的結(jié)果,但表達(dá)式必須只包含常量值。
const calculated = 3 * 2 // 6
常量數(shù)組和切片
需要注意的是,在 Go 中,數(shù)組大小需要是常量。但切片和映射的大小可以動(dòng)態(tài)改變,因此它們不能是常量。
const arraySize = 5
var arr [arraySize]int // 合法
五、變量
變量是存儲(chǔ)數(shù)據(jù)值的存儲(chǔ)單元,其值可以在運(yùn)行時(shí)改變。在 Go 語(yǔ)言中,變量的使用非常靈活但又具有嚴(yán)格的類(lèi)型安全性。
變量聲明和賦值
基本聲明
使用 var
關(guān)鍵字進(jìn)行變量聲明。
var x int
同時(shí)聲明和賦值
var y int = 42
或者使用短變量聲明形式:
z := 42
多變量聲明
var a, b, c int
或者
var (
d int
e float64
)
類(lèi)型描述
基本類(lèi)型
包括 int
, float64
, bool
, string
等。
var integerVar int = 10
var floatVar float64 = 10.99
var boolVar bool = true
var stringVar string = "Hello, Go"
數(shù)值類(lèi)型
Go 支持多種數(shù)值類(lèi)型,包括 int8
, int16
, int32
, int64
, uint8
, uint16
, uint32
, uint64
, float32
, float64
等。
var smallInt int8 = 127
var largeInt int64 = 9223372036854775807
var unsignedInt uint16 = 65535
var floatNum float32 = 3.141592
字符和字符串
Go 有 rune
和 byte
類(lèi)型來(lái)表示 Unicode 字符和 ASCII 字符。
var asciiChar byte = 'A'
var unicodeChar rune = '你'
var str string = "Hello, World!"
布爾類(lèi)型
布爾類(lèi)型只有兩個(gè)值:true
和 false
。
var isActive bool = true
var isCompleted bool = false
指針
Go 支持指針類(lèi)型,但不支持指針運(yùn)算。
var pointer *int
x := 42
pointer = &x
數(shù)組和切片
var arrayExample [5]int = [5]int{1, 2, 3, 4, 5}
var sliceExample []int = arrayExample[1:4]
映射(Maps)
var countryCapitalMap map[string]string
countryCapitalMap = make(map[string]string)
countryCapitalMap["France"] = "Paris"
結(jié)構(gòu)體(Structs)
type Employee struct {
ID int
Name string
Salary float64
}
var emp Employee
接口(Interfaces)
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
var s Shape = Circle{5.0}
函數(shù)類(lèi)型
Go 中,函數(shù)也是一種類(lèi)型,可以作為參數(shù)傳遞。
type AddFunc func(a int, b int) int
var add AddFunc = func(a int, b int) int {
return a + b
}
通道(Channels)
var messageChannel chan string = make(chan string)
復(fù)合類(lèi)型
例如數(shù)組、切片、映射、通道、結(jié)構(gòu)體和接口。
數(shù)組
var arr [5]int
切片
var slice []int
映射
var mapping map[string]int
通道
var ch chan int
結(jié)構(gòu)體
type Person struct {
name string
age int
}
var p Person
接口
type Geometry interface {
Area() float64
}
var g Geometry
值的可尋址性
Go 語(yǔ)言中有些變量是可尋址的,意味著你可以獲取這個(gè)變量的內(nèi)存地址。
var myVar int = 42
var p *int = &myVar
變量作用域
在 Go 中,變量可以有不同的作用域:全局作用域、包內(nèi)作用域、函數(shù)作用域、代碼塊作用域等。
var globalVar int // 全局作用域
func myFunction() {
var functionVar int // 函數(shù)作用域
{
var blockVar int // 代碼塊作用域
}
}
七、常量和變量的高級(jí)用法
在 Go 編程中,常量和變量不僅僅是數(shù)據(jù)存儲(chǔ)的簡(jiǎn)單方式。它們有各種高級(jí)用法,可以用來(lái)優(yōu)化代碼、提高效率或?qū)崿F(xiàn)復(fù)雜的編程模式。
常量的高級(jí)用法
枚舉和 iota
Go 通過(guò) iota
關(guān)鍵字支持枚舉類(lèi)型的實(shí)現(xiàn)。這在一組常量聲明中是非常有用的。
const (
Monday = iota + 1 // Monday = 1
Tuesday // Tuesday = 2
Wednesday // Wednesday = 3
)
類(lèi)型別名
使用類(lèi)型別名,你可以將常量限制為自定義類(lèi)型。
type Weekday int
const (
Sunday Weekday = iota
Monday
// ...
)
無(wú)類(lèi)型和有類(lèi)型常量
無(wú)類(lèi)型的常量可以用在多種場(chǎng)合,它們會(huì)根據(jù)上下文進(jìn)行類(lèi)型推斷。
const x = 42 // 無(wú)類(lèi)型常量
var i int = x
var f float64 = x
變量的高級(jí)用法
變量的作用域
Go 支持塊級(jí)作用域。通過(guò) var
關(guān)鍵字在不同級(jí)別(全局、包級(jí)別、函數(shù)級(jí)別等)聲明變量,你可以控制變量的可見(jiàn)性。
var globalVar = 42 // 全局變量
func main() {
var funcVar = "I'm local" // 函數(shù)級(jí)別變量
}
延遲初始化
使用 init()
函數(shù),你可以在程序開(kāi)始執(zhí)行前初始化變量。
var complexVar complex128
func init() {
complexVar = cmplx.Sqrt(-5 + 12i)
}
指針和地址操作符
雖然 Go 語(yǔ)言沒(méi)有提供指針運(yùn)算,但它允許你通過(guò)地址操作符 &
和解引用操作符 *
來(lái)操作指針。
x := 42
p := &x
fmt.Println(*p) // 輸出 42
使用標(biāo)簽(Tags)和結(jié)構(gòu)體
在結(jié)構(gòu)體中,你可以使用標(biāo)簽(tags)來(lái)附加元數(shù)據(jù),這在序列化和反序列化時(shí)非常有用。
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
關(guān)注公眾號(hào)【TechLeadCloud】,分享互聯(lián)網(wǎng)架構(gòu)、云服務(wù)技術(shù)的全維度知識(shí)。作者擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗(yàn)、團(tuán)隊(duì)管理經(jīng)驗(yàn),同濟(jì)本復(fù)旦碩,復(fù)旦機(jī)器人智能實(shí)驗(yàn)室成員,阿里云認(rèn)證的資深架構(gòu)師,項(xiàng)目管理專(zhuān)業(yè)人士,上億營(yíng)收AI產(chǎn)品研發(fā)負(fù)責(zé)人。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-702795.html
如有幫助,請(qǐng)多關(guān)注
個(gè)人微信公眾號(hào):【TechLeadCloud】分享AI與云服務(wù)研發(fā)的全維度知識(shí),談?wù)勎易鳛門(mén)echLead對(duì)技術(shù)的獨(dú)特洞察。
TeahLead KrisChang,10+年的互聯(lián)網(wǎng)和人工智能從業(yè)經(jīng)驗(yàn),10年+技術(shù)和業(yè)務(wù)團(tuán)隊(duì)管理經(jīng)驗(yàn),同濟(jì)軟件工程本科,復(fù)旦工程管理碩士,阿里云認(rèn)證云服務(wù)資深架構(gòu)師,上億營(yíng)收AI產(chǎn)品業(yè)務(wù)負(fù)責(zé)人。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-702795.html
到了這里,關(guān)于Go類(lèi)型全解:常量與變量大全!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!