成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go:什么是字面量和組合字面量?

系統(tǒng)
說(shuō)出來(lái)不怕大家笑話(huà),在去年年初我剛開(kāi)始學(xué)習(xí) Go 基礎(chǔ)的時(shí)候,有一個(gè)詞困擾了我好久,這個(gè)詞就是 字面量。

[[427693]]

# 0. 前言

說(shuō)出來(lái)不怕大家笑話(huà),在去年年初我剛開(kāi)始學(xué)習(xí) Go 基礎(chǔ)的時(shí)候,有一個(gè)詞困擾了我好久,這個(gè)詞就是 字面量。

之所以會(huì)讓我理解困難,是因?yàn)樵?Go 之前,我都是寫(xiě) Python 的,而且寫(xiě)了很多年,在 Python 中萬(wàn)物皆對(duì)象,不管一個(gè)字面量)有沒(méi)有變量名來(lái)承接,在使用上沒(méi)有任何區(qū)別的,因此在學(xué) Go 之前,我其實(shí)都不知道有字面量這么個(gè)概念。

  1. >>> {"name""iswbm"}.get("name")  # 使用字面量 
  2. 'iswbm' 
  3. >>> 
  4. >>> profile={"name""iswbm"}   # 使用變量名 
  5. >>> profile.get("name"
  6. 'iswbm' 

那么字面量到底是啥東西?怎么那么多的基礎(chǔ)教程里反復(fù)會(huì)提及,卻好像沒(méi)什么人把這個(gè)名詞的概念解釋一下呢?難道是因?yàn)檫@是常識(shí)?尷尬。。

相信正在看這篇文章的你,可能也會(huì)有此疑問(wèn),今天我就梳理一下,我理解中的 字面量,是什么意思?它與普通變量有什么區(qū)別?

# 1. 什么是字面量?

在 Go 中內(nèi)置的基本類(lèi)型有:

  • 布爾類(lèi)型:bool
  • 11個(gè)內(nèi)置的整數(shù)數(shù)字類(lèi)型:int8, uint8, int16, uint16, int32, uint32, int64, uint64, int, uint和uintptr
  • 浮點(diǎn)數(shù)類(lèi)型:float32和float64
  • 復(fù)數(shù)類(lèi)型:complex64和complex128
  • 字符串類(lèi)型:string

而這些基本類(lèi)型值的文本,就是基本類(lèi)型字面量。

比如下面這兩個(gè)字符串,都是字符串字面量,沒(méi)有用變量名或者常量名來(lái)指向這兩個(gè)字面量,因此也稱(chēng)之為 未命名常量。

  1. "hello, iswbm" 
  2.  
  3. `hello, 
  4. iswbm` 

# 2. 同值不同字面量

值的字面量(literal)是代碼中值的文字表示,一個(gè)值可能存在多種字面量表示。

舉個(gè)例子,十進(jìn)制的數(shù)值 15,可以由三種字面量表示

  1. // 16進(jìn)制 
  2. 0xF 
  3.  
  4. // 8進(jìn)制 
  5. 0o17 
  6.  
  7. // 2進(jìn)制 
  8. 0b1111 

通過(guò)比較,可以看出他們是相等的

  1. import "fmt" 
  2.  
  3. func main() { 
  4.     fmt.Println(15 == 0xF)     // true 
  5.     fmt.Println(15 == 017)     // true 
  6.     fmt.Println(15 == 0b1111)  // true 

# 3. 字面量和變量有啥區(qū)別?

下面這是一段很正常的代碼

  1. func foo() string { 
  2.     return "hello" 
  3.  
  4. func main() { 
  5.     bar := foo() 
  6.     fmt.Println(&bar) 

可要是換成下面這樣

  1. func foo() string { 
  2.     return "hello" 
  3.  
  4. func main() { 
  5.     fmt.Println(&foo()) 

可實(shí)際上這段代碼是有問(wèn)題的,運(yùn)行后會(huì)報(bào)錯(cuò)

  1. ./demo.go:11:14: cannot take the address of foo() 

你一定覺(jué)得很奇怪吧?

為什么先用變量名承接一下再取地址就不會(huì)報(bào)錯(cuò),而直接使用在函數(shù)返回后的值上取地址就不行呢?

這是因?yàn)椋绻皇褂靡粋€(gè)變量名承接一下,函數(shù)返回的是一個(gè)字符串的文本值,也就是字符串字面量,而這種基本類(lèi)型的字面量是不可尋址的。

要想使用 & 進(jìn)行尋址,就必須得用變量名承接一下。

# 4. 什么是組合字面量?

首先看下Go文檔中對(duì)組合字面量(Composite Literal)的定義:

Composite literals construct values for structs, arrays, slices, and maps and create a new value each time they are evaluated. They consist of the type of the literal followed by a brace-bound list of elements. Each element may optionally be preceded by a corresponding key。

翻譯成中文大致如下:組合字面量是為結(jié)構(gòu)體、數(shù)組、切片和map構(gòu)造值,并且每次都會(huì)創(chuàng)建新值。它們由字面量的類(lèi)型后緊跟大括號(hào)及元素列表。每個(gè)元素前面可以選擇性的帶一個(gè)相關(guān)key。

什么意思呢?所謂的組合字面量其實(shí)就是把對(duì)象的定義和初始化放在一起了。

接下來(lái)讓我們看看結(jié)構(gòu)體、數(shù)組、切片和map各自的常規(guī)方式和組合字面量方式。

結(jié)構(gòu)體的定義和初始化

讓我們看一個(gè)struct結(jié)構(gòu)體的常規(guī)的定義和初始化是怎么樣的。

常規(guī)方式

常規(guī)方式這樣定義是逐一字段賦值,這樣就比較繁瑣。

  1. type Profile struct { 
  2.     Name string 
  3.     Age int 
  4.     Gender string 
  5.  
  6. func main() { 
  7.     // 聲明對(duì)象 
  8.     var xm Profile 
  9.  
  10.     // 屬性賦值 
  11.     xm.Name = "iswbm" 
  12.     xm.Age = 18 
  13.     xm.Gender = "male" 

組合字面量方式

  1. type Profile struct {    Name string Age int Gender string}func main() { // 聲明 + 屬性賦值    xm := Profile{      Name:   "iswbm",        Age:    18,     Gender: "male", }} 

數(shù)組的定義和初始化

常規(guī)方式

在下面的代碼中,我們?cè)诘?行定義了一個(gè)8個(gè)元素大小的字符串?dāng)?shù)組。然后一個(gè)一個(gè)的給元素賦值。即數(shù)組變量的定義和初始化是分開(kāi)的。

  1. var planets [8]stringplanets[0] = "Mercury" //水星planets[1] = "Venus" //金星planets[2] = "Earth" //地球 

組合字面量方式

該示例中,就是將變量balls的定義和初始化合并了在一起。

  1. balls := [4]string{"basketball""football""Volleyball""Tennis"

slice的定義和初始化

常規(guī)方式

  1. // 第一種var s []string //定義切片變量s,s為默認(rèn)零值nils = append(s, "hat""shirt") //往s中增加元素,len(s):2,cap(s):2// 第二種s := make([]string, 0, 10) //定義s,s的默認(rèn)值不為零值 

組合字面量方式

由上面的常規(guī)方式可知,首先都是需要先定義切片,然后再往切片中添加元素。接下來(lái)我們看下組合字面量方式。

  1. s := []string{"hat""shirt"} //定義和初始化一步完成,自動(dòng)計(jì)算切片的容量和長(zhǎng)度 
  2. // or 
  3. var s = []string{"hat""shirt"

map的定義和初始化

常規(guī)方式

  1. //通過(guò)make函數(shù)初始化 
  2. m := make(map[string]int, 10) 
  3. m["english"] = 99 
  4. m["math"] = 98 

組合字面量方式

  1. m := map[string]int { 
  2.     "english": 99, 
  3.     "math": 98, 
  4.  
  5. //組合字面量初始化多維map 
  6. m2 := map[string]map[int]string { 
  7.     "english": { 
  8.         10: "english"
  9.     }, 

顯然,使用組合字面量會(huì)比常規(guī)方式簡(jiǎn)單了不少。

# 5. 字面量的尋址問(wèn)題

字面量,說(shuō)白了就是未命名的常量,跟常量一樣,他是不可尋址的。

這邊以數(shù)組字面量為例進(jìn)行說(shuō)明

  1. func foo() [3]int { 
  2.     return [3]int{1, 2, 3} 
  3.  
  4. func main() { 
  5.     fmt.Println(&foo()) 
  6.     // cannot take the address of foo() 

關(guān)于尋址性的內(nèi)容,你可以在我的上一篇文章中(Go 面試題 008:Go 中的可尋址和不可尋址怎么理解?)進(jìn)行學(xué)習(xí),總結(jié)得非常詳細(xì)。

是不是很簡(jiǎn)單?跟著明哥一起來(lái)攻克 Go 的各個(gè)邊邊角角的知識(shí)吧

加油噢,我們下篇見(jiàn)

本文轉(zhuǎn)載自微信公眾號(hào)「Go編程時(shí)光」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go編程時(shí)光公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Go編程時(shí)光
相關(guān)推薦

2020-03-31 16:30:09

JS語(yǔ)言ES 6

2020-04-02 09:01:54

JSES 6開(kāi)發(fā)

2022-06-08 08:01:28

模板字面量類(lèi)型

2009-07-06 14:42:24

Visual Basi

2020-12-18 11:35:22

TypeScript語(yǔ)言Java

2023-09-20 00:02:33

C++14二進(jìn)制字面量

2024-11-28 16:32:37

2021-04-07 20:01:23

Go變量常量

2021-06-09 07:55:18

Python格式化字符串

2023-12-13 10:26:38

物聯(lián)網(wǎng)數(shù)據(jù)控制系統(tǒng)

2024-08-22 10:51:09

Typescript場(chǎng)景類(lèi)型

2011-06-19 12:12:12

網(wǎng)站瀏覽量訪問(wèn)量

2018-02-23 15:10:07

輕量應(yīng)用服務(wù)器

2021-03-25 12:00:18

Python變量常量

2022-05-10 14:17:26

加密貨幣供應(yīng)量以太坊

2016-05-12 10:01:40

YunOS

2022-05-10 11:32:12

加密貨幣比特幣供應(yīng)限制

2023-07-27 18:33:08

Go薪資JS

2021-08-30 08:03:22

信號(hào)量庫(kù)Go

2010-06-22 11:07:42

JDK 7Java開(kāi)發(fā)Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费一区二区在线观看 | 久久99精品久久久久久 | 久久久久久久久久久久一区二区 | 91在线视频播放 | 国产一区二区视频免费在线观看 | 爽爽免费视频 | 日韩在线播放一区 | 亚洲精品国产第一综合99久久 | 亚洲一区二区三区 | 国产在线播放av | av男人的天堂av | 日韩一区二区三区视频 | 成人免费精品视频 | 日本久草| 久久成人免费视频 | 欧美久久久久久 | 国产一区免费视频 | 久久精品日产第一区二区三区 | 91av在线免费 | 国产在线精品一区二区 | 久久精品网 | 日韩国产免费观看 | 色秀网站 | 二区视频 | 精品一区二区三区视频在线观看 | 亚洲激情综合 | 国产精品久久久久久久久久久久久久 | 国产精品一区二区在线 | 一区二区三区在线观看视频 | 自拍第1页| 国产一区二区三区网站 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 九九激情视频 | 中文字幕一区在线观看视频 | 天堂素人约啪 | 伊人伊成久久人综合网站 | 久久99精品久久久97夜夜嗨 | 久久精品视频播放 | 免费av观看 | gav成人免费播放视频 | 日韩www |