golang
1.golang 數據類型數組
布爾類型 true/false var b bool ,在golang底層bool不是1/0表示的閉包
數值類型 :var i int =3 / var i:=3函數
數字在計算機內部是以二進制的方式存儲的,二進制位就是一系列布爾值,取值要麼爲1,要麼爲0.spa
1位表示1或0,對於4位整數能夠表示16個不一樣的數字0~15.指針
帶符號整數和無符號整數: 帶符號整數,就是負數,須要一位來表示符號,這一般是符號-。orm
因此4位帶符號整數的取值範圍爲 :-8~7 ;進程
浮點數: 浮點數是帶小數點的數字,如11.2,0.11,32.21.: var a float64 = 0.111內存
字符串: var s string ="foo" ,必須用雙引號 , s + = "foo",字符串的拼接資源
數組: 聲明數組時,必須指定其長度和類型 var arrOne [4]string , arrTwo [10]int
賦值: arrOne[0] = "John" ,(一般數組的鍵用數字 )
2.檢查變量類型用: 標準庫中的reflect包
var s [2]string
fmt.Println(reflect.TypeOf(s))
3.類型轉換: strconv包提供一整套類型裝換方法,
var s string = "true"
b.err:=strconv.ParseBool(s ) 字符串轉換布爾
s:=strconv.FormatBool(true) 布爾值轉換成字符串
4.多變量賦值
var s,t string = "foo","bar"
var(
s string = "foo"
i int =4
)
默認值:整數0,浮點型0,布爾值false, 字符串就是「」 空字符串,打印:
var (
i int
f float32
b bool
s string
)
fmt.Printf("%v %v %v %q\n",i,f,b,s) //0 0 false ""
package main
import (
"fmt"
"time"
)
const DefaultClientTimeout = 30 * time.Second
type Client struct{
cache map[string]interface{}
Host string
Timeout time.Duration
}
func NewClient(host string) *Client{ //指向client結構體的一個指針,指針返回的是變量的地址,取出地址的值就用**Client
return &Client{
cache: map[string]interface{}{"name":"liufeng","age":21},
Host:host,
Timeout:DefaultClientTimeout,
}
}
func main(){
tt :=NewClient("www.baidu.com")
fmt.Println(&tt.Host)
fmt.Println(&tt)
fmt.Println(tt.Host)
fmt.Println(tt.cache["name"])
fmt.Println(tt.cache["age"])
}
fmt.Printf("%d",123) %p 輸出整數
fmt.Printf("%+v",b) %+v 值輸出, fmt.Printf("%p",&b) %p 輸出指針地址 &b
fmt.Printf() 配合佔位符,打印數據。
fmt.Println(打印字字符串內容)
9.打印變量的方法:
它不關心這些捕獲了的變量和常量是否已經超出了做用域,因此只有閉包還在使用它,這些變量就還會存在。
由於匿名函數(閉包),有一個很重要的特色:
因爲在定義Test( )函數時指定了返回的類型是一個匿名函數,而且該匿名函數返回的類型是整型。因此在Test( )函數中定義了一個匿名函數,而且將整個匿名函數返回,匿名函數返回的是整型。在main( )函數中定義了一個變量f,該變量的類型是匿名函數,f( )表示調用執行匿名函數。最終執行完成後發現,實現了數字的累加。雖然Test()已經返回了,可是返回的值:func()還在全局變量中使用,三次調用 f(),所以返回值會保存在堆上,即便棧釋放了內存資源,但func()保存在堆中,數據不會釋放。
fmt.Println(f())
fmt.Println(f())
f:=Test() fmt.Println(f())
func main(){
}
}
return x
x++
return func()int{
var x int
func Test() func() int{ //func() 這個就是匿名函數,做爲類型返回值int
利用匿名函數,實現每次調用變量累加值
堆(heap):堆是用於存放進程執行中被動態分配的內存段。它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時。新分配的內存就被動態加入到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
棧(stack):棧又稱堆棧, 是用戶存放程序暫時建立的局部變量,也就是說咱們函數括弧「{}」中定義的變量(但不包含static聲明的變量。static意味着在數據段中存放變量)。
8.匿名函數類型,經常使用在閉包中,講到閉包就要理解變量聲明週期。
2.在函數 返回值中 用指針,在最後函數返回值的時候 返回值的地址。接受函數返回值的變量也能夠直接打印出來值,應該是印值複製的。
總結: 1.在函數 形參中用 指針*int , 在調用函數 傳入變量的地址 &var
7.指針的靈活使用:
6.常量聲明: const
(在golang中只有三種引用類型它們分別是切片slice、字典map、管道channel。其它的所有是值類型,引用類型能夠簡單的理解爲指針類型,它們都是經過make完成初始化)
打印變量內存地址: fmt.Println(&s) ,內存地址是十六進制表示
var s string = "hello,world"
要獲取變量在內存中的地址,可在變量名前加上&字符。
golang在聲明變量時,在內存中分配了一個位置,以便可以存儲,修改和獲取變量的值。
5.使用指針, 指針是golang的一種類型,指向變量所在的內存單元,聲明在變量名前加上* 星號字符。
變量做用域:指變量在什麼地方可使用,而不是變量在什麼地方聲明。
簡短變量聲明: s : = "hello,world" ; 注意 golang規定不能再函數外面使用 簡短變量聲明