Go 復合資料型別

2021-10-03 07:54:16 字數 2712 閱讀 7232

3、map

4、結構體

5、json、文字和html模板

關於函式入參:

當呼叫乙個函式的時候,函式的每個呼叫引數將會被賦值給函式內部的引數變數,所以函式引數變數接收的是乙個複製的副本,並不是原始呼叫的變數。因為函式引數傳遞的機制導致傳遞大的陣列型別是低效的,並且對陣列引數的任何的修改都是發生在複製的陣列上,並不能直接修改呼叫時原始的陣列變數。

當然,我們可以顯式地傳入乙個陣列指標,那樣的話函式通過指針對陣列的任何修改都可以直接反饋到呼叫者。

關於函式入參是值傳遞還是引用傳遞可參考:飛雪無情

用slice模擬乙個stack

1、初始化stack

stack =

(stack, v)

// push v

2、stack的頂部位置對應slice的最後乙個元素:
top := stack[

len(stack)-1

]// top of stack

3、通過收縮stack可以彈出棧頂的元素
stack = stack[

:len

(stack)-1

]// pop

4、要刪除slice中間的某個元素並儲存原有的元素順序,可以通過內建的copy函式將後面的子slice向前依次移動一位完成:
func

remove

(slice [

]int

, i int)[

]int

如果刪除元素後不用保持原來順序的話,我們可以簡單的用最後乙個元素覆蓋被刪除的元素

在go語言中,乙個map就是乙個雜湊表的引用,map型別可以寫為map[k]v,其中k和v分別對應key和value。其中k對應的key必須支援==比較運算子的資料型別,所以map可以通過測試key是否相等來判斷是否已經存在。

建立map

內建的make函式可以建立乙個map:

ages :=

make

(map

[string

]int

)

用map字面值的語法建立map:

ages :=

map[

string

]int

訪問map的值

map中的元素通過key對應的下標語法訪問:

ages[

"alice"]=

32 fmt.

println

(ages[

"alice"])

// "32"

判斷key是否存在的取法:

age, ok := ages[

"bob"

]//age表示key對應的value,ok表示key是否存在也就是value是否能取到

if ok

刪除map的值

delete

(ages,

"alice"

)// remove element ages["alice"]

結構體是一種聚合的資料型別,是由零個或多個任意型別的值聚合成的實體。

結構體變數的成員可以通過點操作符訪問。

如果結構體成員名字是以大寫字母開頭的,那麼該成員就是匯出的(外部可使用);這是go語言匯出規則決定的。乙個結構體可能同時包含匯出和未匯出的成員.

乙個命名為s的結構體型別將不能再包含s型別的成員:因為乙個聚合的值不能包含它自身。

如果考慮效率的話,較大的結構體通常會用指標的方式傳入和返回。

如果要在函式內部修改結構體成員的話,用指標傳入是必須的;因為在go語言中,所有的函式引數都是值拷貝傳入的,函式引數將不再是函式呼叫時的原始變數。(重點

如果結構體的全部成員都是可以比較的,那麼結構體也是可以比較的,那樣的話兩個結構體將可以使用==或!=運算子進行比較。

go語言有乙個特性讓我們只宣告乙個成員對應的資料型別而不指名成員的名字;這類成員就叫匿名成員。匿名成員的資料型別必須是命名的型別或指向乙個命名的型別的指標

宣告和訪問:

type point struct

type circle struct

//訪問 circle的x,y

var c circle

fmt.

println

(c.x,c.y)

初始化結構體

var c circle

c = circle: circle

, radius:

5}

參考原文

Go 復合資料型別 切片 slice

切片 package main import fmt math rand time func main arr1 int arr2 make int,6,8 arr3 make int,6 fmt.printf 長度len d,容量cap d n len arr cap arr 6 6 fmt.pr...

復合資料型別

復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...

復合資料型別

一 struct結構體 封裝資料 存放多種不同的資料型別 struct的宣告放在全域性區 1.宣告和定義 宣告 struct student struct student stu array 3 int i for i 0 i 3 i for i 0 i 3 i include struct stu...