go語言基礎課程 講師:張長志

go語言基礎課程 講師:張長志

類型 名稱 長度 默認值 說明
pointer 指針(地址) nil
array 數組 0
slice 切片 nil 引用類型
map 字典 nil 引用類型
struct 結構體

go 語言裏面對指針作了弱化數組

指針

保存某個變量的地址,須要指針類型 *int 保存int類型的地址函數

聲明(定義),定義只是特殊的聲明,定義一個變量p 類型爲int var p int大數據

1539001702021

代碼實戰

package main

import "fmt"

func main(){

    var a int = 10
    //每一個變量有2層含義:變量的內存 變量地址
    fmt.Printf("a=%d\n",a) //變量的內存
    fmt.Printf("&a = %v\n",&a) //變量的地址

    //保存地址必需要用指針(地址)

    var p *int  //定義一個變量p,類型爲int類型
    p = &a  //指針變量指向誰,就把誰的地址賦值給指針變量
    fmt.Printf("p=%v,&a=%v,*p=%v\n",p,&a,*p)

    *p = 1000
    fmt.Printf("p=%v,&a=%v,*p=%v\n",p,&a,*p)
}

指針的注意點

不能操做沒有合法指向的內存指針

import "fmt"

func main(){
    var p *int //指針變量
    p = nil
    fmt.Println("p=",p)

    //*p = 1000 invalid memory address or nil pointer dereference
    //由於p沒有任何指向

    var a int
    p = &a
    *p = 1000
    fmt.Println("a=",a)

}

new 開闢空間

package main

import "fmt"

func main(){
     //a := 10     //整形變量
     var p *int //指針變量
    // p = &a
    // *p = 1000 //a = 1000

    p   = new(int)
    fmt.Printf("p=%v,*p=%d\n",p,*p)

    *p = 6000

    fmt.Printf("p=%v,*p=%d\n",p,*p)
    
    q := new(int) //自動推導
    *q =88888
    fmt.Println("*q=",*q)
}

普通變量和指針變量做爲參數傳遞

一、普通參數

func swap(a,b int)  {
    a,b = b,a
    fmt.Printf("swap:a=%d,b=%d\n",a,b) //20 10
}

func main(){
    a,b := 10,20
    //經過一個函數swap 交換a b的內容
    swap(a,b)
    fmt.Printf("main: a=%d,b=%d\n",a,b) //10 20
}

1539003111096

2.指針做爲函數

import "fmt"

func swap1(p1,p2 *int){
   *p1,*p2 = *p2,*p1
}

func main()  {
   a,b :=10,20
   swap1(&a,&b)

   fmt.Printf("main: a= %d,b=%d\n",a,b)

}

1539003482739

數組

i1 =100 i2 =95code

數組就是指一系列同一類型數據集合。數組中包含的每一個數據被稱爲數組元素(element),一個數組包含的元素個數被稱爲數組長度視頻

var id [50]int內存

id[0] = 100element

id[1] = 100get

id[2] =99table

package main

import "fmt"

func main(){
   //id1 := 1
   //id2 :=2
   //id3 :=3
   var id [50]int  //數組,同一類型的集合

   for i :=0 ;i<len(id);i++{
      id[i] = i+1
      fmt.Printf("id[%d]=%d\n",i,id[i])
   }
}

1數組基本使用

package main

import (
   "fmt"
)

func main(){
   //定義一個數組 [10]int和 [5]int 是不一樣的類型
   //[數字],這個數字表明的是數組的元素個個數
   var a [10]int
   var b [5]int
   fmt.Printf("len(a)=%d,len(b)=%d\n",len(a),len(b))

   //注意點 定義數組,指定的數組的個數必須是常量 non-constant array bound n

   //n:=10
   //var c [n]int
   //fmt.Printf("len(c)=%d\n",len(c))
   // 操做數組元素,從0開始,到len()-1,不對稱元素,這個數字叫下標,下標是能夠使用變量的
   a[0]= 1
   i :=1
   a[i] = 10

   //賦值,每一個元素
   for i :=0;i<len(a);i++{
      a[i]=i+1
   }

  //打印,第一個返回下標 ,第二個是返回元素對應的值
   for i,data :=range a{
      fmt.Printf("a[%d]=%d\n",i,data)
   }
   
}

2.數組的初始化

package main

import (
   "fmt"
)

func main()  {
    //聲明定義同時初始化

   var a [5]int = [5]int{1,2,3,4,5}
   fmt.Println("a=",a)

   b := [5]int{1,2,3,4,5} //自動推導
   fmt.Println("b=",b)

   //部分初始化 沒有初始化的int自動補全0
   c :=[5]int{1,2,3}
   fmt.Println("c=",c)

   //指定某個元素的初始化
   d := [5]int{2:10,4:20}
   fmt.Println("d=",d)

}

二維數組

go語言班級 50 c語言班級 40 大數據班級 30

[][] 有多少個【】 表明有多少維

有多少個【】就用多個循環

var a[3][4]int
package main

import "fmt"

func main(){
   //有多少個【】 表明有多少維
   //有多少個【】就用多個循環

   var a [3][4]int //有三個班級 每一個班級有4人 1 ,2,3,4 5,6,7,8 9,10,11,12
   k:=0
   for i:=0;i<3;i++{
      for j:=0;j<4;j++{
         k++
         a[i][j] = k
         fmt.Printf("a[%d][%d]=%d,",i,j,a[i][j])
      }
      fmt.Println()
   }

   fmt.Println("a=",a)

   //有3個元素 每一個元素又是一維數組[4]int
   b := [3][4]int{{1,2,3,4},{5,6,7,8},{9,10,11,12}}
   fmt.Println("b=",b)

   //部分初始化,沒有初始化的若是是int 補全0
   c := [3][4]int{{1,2,3},{2,6},{4}}
   fmt.Println("c=",c)

   d :=[3][4]int{{1,2,3,4}}
   fmt.Println("d=",d)

   e := [3][4]int{1:{5,6,7,8}}
   fmt.Println("e=",e)

}

數組的比較和賦值

package main

import "fmt"

func main()  {
   //只支持 == != 比較是否是每一個元素都同樣 2個數組比較類型要一致 [3]int [4]int
   a := [5]int{1,2,3,4,5}
   b := [5]int{1,2,3,4,5}
   c:=[5]int{1,2,3}

   fmt.Println("a==b",a==b)
   fmt.Println("a==c",a==c)
  //同類型的數組能夠賦值
   var d [5]int
   d = c
   fmt.Println("d=",d)


}

隨機數使用

驗證碼 4 6 數 隨機的

1539007248401

1539007268167

package main

import (
    "math/rand"
    "fmt"
    "time"
)

func main()  {
    //若是種子參數一致,每次運行的程序產生的結果是一致的
    //每次運行讓種子參數不一致
    //rand.Seed(6666)
    rand.Seed(time.Now().UnixNano())// 以當前系統時間做爲種子參數

    for i:=0;i<6;i++{
        //fmt.Println("rand=",rand.Int()) //隨機數很大
        fmt.Println("rand=",rand.Intn(100)) //限制在100之內的數字
    }

}

更多免費資料和視頻:http://www.dataxueyuan.com/

相關文章
相關標籤/搜索