go語言學習 二

2021-09-10 01:47:11 字數 2941 閱讀 2689

go語言裡和c語言一樣也有指標的概念  

var i int = 1

var pint *int = &i

//輸出:i=1     pint=0xf8400371b0       *pint=1

fmt.printf("i=%d\tpint=%p\t*pint=%d\n", i, pint, *pint)

*pint = 2

//輸出:i=2     pint=0xf8400371b0       *pint=2

fmt.printf("i=%d\tpint=%p\t*pint=%d\n", i, pint, *pint)

i = 3

//輸出:i=3     pint=0xf8400371b0       *pint=3

fmt.printf("i=%d\tpint=%p\t*pint=%d\n", i, pint, *pint)

對於指標要了解的更多是指標的定義方式,使用和c語言也是一樣的,指標的使用應該還是會出現很多坑,所以以後如果發現了再細做詳解,對於定義方式go語言可以說都是和c語言反過來的,

對於記憶體分配c語言和c++有不同的方式 c主要是malloc realloc calloc 而c++裡邊則是new new和malloc最大的區別在我看來就是new在定義自定義型別的時候 會呼叫這些類的建構函式,在delete會直接呼叫析構函式 在go語言裡邊有兩種分配機分別是內建的函式new和make,他們所做的事情不同,所應用到的型別也不同

new是乙個分配記憶體的內建函式, 但不同於其他語言中同名的new所做的工作,他只是將記憶體清零,而不是初始化記憶體,new(t)為乙個型別為t的新專案分配了值為0的儲存空間, 並且返回其位址,也就是乙個型別為*t的值,用go的術語來說,就是他返回了乙個指向新分配的型別為t的0值的指標,make(t,args)函式的目的與new(t)不同,他僅用於建立切片、map和chan(訊息管道),並返回型別t(這裡要注意不是返回t*)的乙個被初始化了的不是0的例項,這種差別的出現是由於這三種型別實質上是對在使用前必須進行初始戶的資料的引用,例如切片是乙個具有三項內容的描述符 包括只想資料 的指標,長度以及容量, 在這三項內容被初始化之前,切片值為nil,對於切片對映和通道,make初始化了其內部的資料結構並準備了將要使用的值。

var p *int = new(int)   // 為切片結構分配記憶體;*p == nil;很少使用

var v  int = make(int, 10) // 切片v現在是對乙個新的有10個整數的陣列的引用

// 不必要地使問題複雜化:

var p *int = new(int)

fmt.println(p) //輸出:&

*p = make(int, 10, 10)

fmt.println(p) //輸出:&[0 0 0 0 0 0 0 0 0 0]

fmt.println((*p)[2]) //輸出: 0

// 習慣用法:

v := make(int, 10)

fmt.println(v) //輸出:[0 0 0 0 0 0 0 0 0 0]

這段** 是new和make的區別,不過理解的還是不太透徹,看樣子new在go語言裡邊使用的很少,new申請出來的空間還是需要經過make來進行初始化這裡說的是 make是用來初始化三種資料slice map channel,對於map好理解接觸過一點點,對於channel是一點都不理解,暫時不考慮,slice到底是個什麼

在go語言裡邊陣列是具有固定長度的並且擁有0個或者多個相同或者相同資料型別元素的序列,由於陣列長度固定,所以在go語言比較少直接使用,而slice長度可增可減,使用場合就比較多,其實在我看來就是c語言裡邊普通陣列和c++裡邊vector的區別。slice讓程式設計師更加省心。vector本質在學習的時候了解過就是三個指標來實現的,而slice也是有三個屬性,分別是指標、長度和容量 指標可以理解成我們訪問陣列指定內容的下標,長度是slice中含有的元素個數,容量就是他可以放下多少資料,在go語言裡邊可以用內建函式 len和cap來返回slice的長度和容量。在slice裡追加元素的時候如果容量不足,一般來說會擴容到原來的兩倍。對於更加詳細的理解會在以後遇到後進行更加深入的了解。

在go語言中還有乙個東西叫做切片切片通俗 的來說就是對陣列的某一段資料的引用

package main

import "fmt"

func main() {

names := [4]string{

"john",

"paul",

"george",

"ringo",

fmt.println(names)

a := names[0:2]

b := names[1:3]

fmt.println(a, b)

b[0] = "***"

fmt.println(a, b)

fmt.println(names)

來看這個程式 這個程式的輸出

可以看出來 a是names的一段引用,b也是names的一段引用,並且他們都有重合的部分,當我們對這些引用進行修改的時候那整個陣列都會被更改。

切片他會更像一種沒有長度的陣列,他在定義陣列的時候不要指定確切的長度。

在切片的時候也可以預設他的上下界 

如果第乙個數字不指定就是從第乙個資料開始,最後乙個不指定就是到最後乙個資料結束,自然如果兩個都不指定那就是全部資料。

s先是被填充了6個數字,然後擷取了1-4 切片預設是左閉右開的 所以是從下標為1的開始到3的放進去,4沒有進去。然後再次切片的時候從0開始到2不包括2結束,第三次從1開始到最後他就是最後所以直接結束。

GO語言學習二(基礎)

一 包 每個 go 程式都是由包組成的。程式執行的入口是包main 二 匯入 兩種方式 多個 import import fmt import math 用圓括號組合了匯入,打包匯入 import fmt math 三 函式 函式可以沒有引數或接受多個引數 當兩個或多個連續的函式命名引數是同一型別,...

Go語言學習 二 常量

package main import fmt 1定義常量的關鍵字const const pi float64 3.14159265358979323846 const zero 0.0 無型別負點常量 const size int64 1024 eof 1 無型別整形常量 const u,v fl...

Go語言學習筆記 二)

1 var a int 預設a 02 var b string b 3 var c bool c fales4 var d int 85 var e string hello 6 或者7 var14 格式化輸出 15 fmt.printf a d b s c t d d e s n a,b,c,d,...