真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言數(shù)組平均值 go數(shù)組定義

Go語言基礎語法(一)

本文介紹一些Go語言的基礎語法。

阿榮網(wǎng)站建設公司創(chuàng)新互聯(lián),阿榮網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為阿榮千余家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設要多少錢,請找那個售后服務好的阿榮做網(wǎng)站的公司定做!

先來看一個簡單的go語言代碼:

go語言的注釋方法:

代碼執(zhí)行結(jié)果:

下面來進一步介紹go的基礎語法。

go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,

常用方法:

示例代碼:

執(zhí)行結(jié)果:

更多格式化方法可以訪問中的fmt包。

log包實現(xiàn)了簡單的日志服務,也提供了一些格式化輸出的方法。

執(zhí)行結(jié)果:

下面來介紹一下go的數(shù)據(jù)類型

下表列出了go語言的數(shù)據(jù)類型:

int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。

常量是在程序編譯時就確定下來的值,程序運行時無法改變。

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

Go 語言的運算符主要包括算術(shù)運算符、關系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。

算術(shù)運算符:

關系運算符:

邏輯運算符:

位運算符:

賦值運算符:

指針相關運算符:

下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。

if語法格式如下:

if ... else :

else if:

示例代碼:

語法格式:

另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。

示例代碼:

執(zhí)行結(jié)果:

下面介紹幾種循環(huán)語句:

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

也可以通過標記退出循環(huán):

--THE END--

go語言中數(shù)組使用的注意事項和細節(jié)

1、數(shù)組是多個 相同類型 的數(shù)據(jù)的組合,一個數(shù)組一旦聲明/定義了,其 長度是固定的,不能動態(tài)變化 。

2、var arr []int? ? 這時arr就是一個slice 切片 。

3、數(shù)組中的元素可以是任何數(shù)據(jù)類型,包括值類型和引用類型,但是 不能混用 。

4、數(shù)組創(chuàng)建后,如果沒有賦值,有默認值如下:

? ? 數(shù)值類型數(shù)組:????默認值為 0

? ? 字符串數(shù)組:? ? ? ?默認值為 ""

? ? bool數(shù)組:? ? ? ? ? ?默認值為 false

5、使用數(shù)組的步驟:

? ? (1)聲明數(shù)組并開辟空間

? ? (3)給數(shù)組各個元素賦值

? ? (3)使用數(shù)組

6、數(shù)組的下標是從0開始的。

7、數(shù)組下標必須在指定范圍內(nèi)使用,否則報panic:數(shù)組越界,比如var arr [5]int的有效下標為0~4.

8、Go的數(shù)組屬于 值類型 ,在默認情況下是 值傳遞 ,因此會進行值拷貝。 數(shù)組間不會相互影響。

9、如想在其他函數(shù)中去修改原來的數(shù)組,可以使用 引用傳遞 (指針方式)。

10、長度是數(shù)組類型的一部分,在傳遞函數(shù)參數(shù)時,需要考慮數(shù)組的長度,看以下案例:

題1:編譯錯誤,因為不能把[3]int類型傳遞給[]int類型,前者是數(shù)組,后者是切片;

題2:編譯錯誤,因為不能把[3]int類型傳遞給[4]int類型;

題3:編譯正確,因為[3]int類型傳給[3]int類型合法。

Golang 中數(shù)組(Array)和切片(Slice)的區(qū)別

Go 中數(shù)組的長度是不可改變的,而 Slice 解決的就是對不定長數(shù)組的需求。他們的區(qū)別主要有兩點。

數(shù)組:

切片:

注意 1

雖然數(shù)組在初始化時也可以不指定長度,但 Go 語言會根據(jù)數(shù)組中元素個數(shù)自動設置數(shù)組長度,并且不可改變。切片通過 append 方法增加元素:

如果將 append 用在數(shù)組上,你將會收到報錯:first argument to append must be slice。

注意 2

切片不只有長度(len)的概念,同時還有容量(cap)的概念。因此切片其實還有一個指定長度和容量的初始化方式:

這就初始化了一個長度為3,容量為5的切片。

此外,切片還可以從一個數(shù)組中初始化(可應用于如何將數(shù)組轉(zhuǎn)換成切片):

上述例子通過數(shù)組 a 初始化了一個切片 s。

當切片和數(shù)組作為參數(shù)在函數(shù)(func)中傳遞時,數(shù)組傳遞的是值,而切片傳遞的是指針。因此當傳入的切片在函數(shù)中被改變時,函數(shù)外的切片也會同時改變。相同的情況,函數(shù)外的數(shù)組則不會發(fā)生任何變化。

go語言:數(shù)組

數(shù)組是一個由 固定長度 的 特定類型元素 組成的序列,一個數(shù)組可以由零個或多個元素組成。 數(shù)組是值類型

數(shù)組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從0開始到數(shù)組長度減1的位置,內(nèi)置函數(shù) len() 可以返回數(shù)組中元素的個數(shù)。

2.類型的打印,結(jié)果的第二種打印方式

3.對元素的修改或者賦值

4.判斷數(shù)組是否相等:長度、類型

4.數(shù)組的地址:連續(xù)存儲的空間

5.數(shù)組的賦值、地址、取值

6.數(shù)組的默認值

7.數(shù)組的初始化

8.數(shù)組的逆置

9.求數(shù)組的最大值、最小值、平均值

10.對數(shù)組字符串進行連接

11.冒泡排序法的實現(xiàn)

12.數(shù)組做函數(shù)的參數(shù)

13.二維數(shù)組:賦值和地址

14.二維數(shù)組:打印和輸出

15. 指針數(shù)組,每一個元素都是地址

17.數(shù)組的內(nèi)存分配

Go切片數(shù)組深度解析

Go 中的分片數(shù)組,實際上有點類似于Java中的ArrayList,是一個可以擴展的數(shù)組,但是Go中的切片由比較靈活,它和數(shù)組很像,也是基于數(shù)組,所以在了解Go切片前我們先了解下數(shù)組。

數(shù)組簡單描述就由相同類型元素組成的數(shù)據(jù)結(jié)構(gòu), 在創(chuàng)建初期就確定了長度,是不可變的。

但是Go的數(shù)組類型又和C與Java的數(shù)組類型不一樣, NewArray 用于創(chuàng)建一個數(shù)組,從源碼中可以看出最后返回的是 Array{}的指針,并不是第一個元素的指針,在Go中數(shù)組屬于值類型,在進行傳遞時,采取的是值傳遞,通過拷貝整個數(shù)組。Go語言的數(shù)組是一種有序的struct。

Go 語言的數(shù)組有兩種不同的創(chuàng)建方式,一種是顯示的初始化,一種是隱式的初始化。

注意一定是使用 [...]T 進行創(chuàng)建,使用三個點的隱式創(chuàng)建,編譯器會對數(shù)組的大小進行推導,只是Go提供的一種語法糖。

其次,Go中數(shù)組的類型,是由數(shù)值類型和長度兩個一起確定的。[2]int 和 [3]int 不是同一個類型,不能進行傳參和比較,把數(shù)組理解為類型和長度兩個屬性的結(jié)構(gòu)體,其實就一目了然了。

Go中的數(shù)組屬于值類型,通常應該存儲于棧中,局部變量依然會根據(jù)逃逸分析確定存儲棧還是堆中。

編譯器對數(shù)組函數(shù)中做兩種不同的優(yōu)化:

在靜態(tài)區(qū)完成賦值后復制到棧中。

總結(jié)起來,在不考慮逃逸分析的情況下,如果數(shù)組中元素的個數(shù)小于或者等于 4 個,那么所有的變量會直接在棧上初始化,如果數(shù)組元素大于 4 個,變量就會在靜態(tài)存儲區(qū)初始化然后拷貝到棧上。

由于數(shù)組是值類型,那么賦值和函數(shù)傳參操作都會復制整個數(shù)組數(shù)據(jù)。

不管是賦值或函數(shù)傳參,地址都不一致,發(fā)生了拷貝。如果數(shù)組的數(shù)據(jù)較大,則會消耗掉大量內(nèi)存。那么為了減少拷貝我們可以主動的傳遞指針呀。

地址是一樣的,不過傳指針會有一個弊端,從打印結(jié)果可以看到,指針地址都是同一個,萬一原數(shù)組的指針指向更改了,那么函數(shù)里面的指針指向都會跟著更改。

同樣的我們將數(shù)組轉(zhuǎn)換為切片,通過傳遞切片,地址是不一樣的,數(shù)組值相同。

切片是引用傳遞,所以它們不需要使用額外的內(nèi)存并且比使用數(shù)組更有效率。

所以,切片屬于引用類型。

通過這種方式可以將數(shù)組轉(zhuǎn)換為切片。

中間不加三個點就是切片,使用這種方式創(chuàng)建切片,實際上是先創(chuàng)建數(shù)組,然后再通過第一種方式創(chuàng)建。

使用make創(chuàng)建切片,就不光編譯期了,make創(chuàng)建切片會涉及到運行期。1. 切片的大小和容量是否足夠?。?/p>

切片是否發(fā)生了逃逸,最終在堆上初始化。如果切片小的話會先在?;蜢o態(tài)區(qū)進行創(chuàng)建。

切片有一個數(shù)組的指針,len是指切片的長度, cap指的是切片的容量。

cap是在初始化切片是生成的容量。

發(fā)現(xiàn)切片的結(jié)構(gòu)體是數(shù)組的地址指針array unsafe.Pointer,而Go中數(shù)組的地址代表數(shù)組結(jié)構(gòu)體的地址。

slice 中得到一塊內(nèi)存地址,array[0]或者unsafe.Pointer(array[0])。

也可以通過地址構(gòu)造切片

nil切片:指的unsafe.Pointer 為nil

空切片:

創(chuàng)建的指針不為空,len和cap為空

當一個切片的容量滿了,就需要擴容了。怎么擴,策略是什么?

如果原來數(shù)組切片的容量已經(jīng)達到了最大值,再想擴容, Go 默認會先開一片內(nèi)存區(qū)域,把原來的值拷貝過來,然后再執(zhí)行 append() 操作。這種情況對現(xiàn)數(shù)組的地址和原數(shù)組地址不相同。

從上面結(jié)果我們可以看到,如果用 range 的方式去遍歷一個切片,拿到的 Value 其實是切片里面的值拷貝,即淺拷貝。所以每次打印 Value 的地址都不變。

由于 Value 是值拷貝的,并非引用傳遞,所以直接改 Value 是達不到更改原切片值的目的的,需要通過 slice[index] 獲取真實的地址。

go語言中怎么定義一個string數(shù)組

package main

import "fmt"

var arr [2]int //申明一個數(shù)組

func main() {

arr[0] = 1 //數(shù)組賦值

fmt.Println(arr)

arrtest := [3]int{1, 2, 3} //數(shù)組的另一種申明方式

fmt.Println(arrtest)

a := [...]int{1, 2} //[...]自動識別數(shù)組的長度

fmt.Println(a)

fmt.Println(len(a))//輸出數(shù)組的長度

}

下邊是slice的申明和使用其實這就是一種動態(tài)的數(shù)組

復制代碼 代碼如下:

package main

import "fmt"

func main() {

d := []int{1, 2, 3} //申明一個slice這個是動態(tài)的數(shù)組,沒有長度

fmt.Println(d)

var q, w []int

q = d[0:1] //可以定取得上邊的長度

w = d[1:3]

d = append(d, 2) //向其中添加元素

fmt.Println(d)

fmt.Println(q, w)

}


文章名稱:go語言數(shù)組平均值 go數(shù)組定義
網(wǎng)站網(wǎng)址:http://weahome.cn/article/hideic.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部