Golang 學習入坑(四)Go語言數組/切片/結構體/指針/Range(范圍)/interface(接口)


(一)數組

//數組定義:var variable_name [SIZE] variable_type
var arr [10] int
//以上為一維數組的定義方式。例如以下定義了數組 arr 長度為 10 類型為int:
//初始化數組:
var b = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//初始化數組中 {} 中的元素個數不能大於 [] 中的數字。如果忽略 [] 中的數字不設置數組大小,Go 語言會根據元素的個數來設置數組的大小:
b := []float32{1000.0, 2.0, 3.4, 7.0, 50.0}

(二)切片

 

定義:Go 語言切片是對數組的抽象。
Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。
//你可以聲明一個未指定大小的數組來定義切片:
var identifier []type
使用make函數定義切片。或使用make()函數來創建切片:   
var slice1 []type = make([]type, len) 簡寫為:slice1 := make([]type, len)
其中len代表長度,cap代表最長多少  例如:make([]T, length, capacity)
// 創建一個整型切片其長度和容量都是 10 個元素
slice := make([]int, 10)
創建一個整型切片其長度為 3 個元素,容量為 5 個元素
slice := make([]int, 3, 5)
//下邊這個函數可以打印切片
func printfslic(x [] int) {
  fmt.Printf("切片的長度為%d,最大為%d,slice為%v。。第二個參數為:%d\n",len(x),cap(x),x)
}
//其中nil切片/空切片。切片擴容。/切片賦值-限制切片容量
具體以后整理下:
現在看下這個自己打印下。https://www.cnblogs.com/sparkdev/p/10704614.html

(三)結構體

Go 語言中數組可以存儲同一類型的數據,但在結構體中我們可以為不同項定義不同的數據類型。

結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。
結構體定義需要使用 type 和 struct 語句。struct 語句定義一個新的數據類型,結構體中有一個或多個成員。type 語句設定了結構體的名稱。結構體的格式如下:
type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}
一旦定義了結構體類型,它就能用於變量的聲明,語法格式如下
variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

例子:
package main

import "fmt"

type person struct{
    name string
    age int
    ismarry bool
}

func main() {
    tongtong := person{"張tongtong",25,false}
    fmt.Println(tongtong)
    tongtong1 := person{name:"張tongtong",age:27,ismarry:true}
    fmt.Println(tongtong1)
}

(四)指針

Go 語言中指針是很容易學習的,Go 語言中使用指針可以更簡單的執行一些任務。
Go 語言的取地址符是 &,放到一個變量前使用就會返回相應變量的內存地址。

package main
import "fmt"

func main() {
   a := 10
   fmt.Printf("變量的地址: %x\n", &a  )		//打印出來a變量的地址
}
什么是指針?一個指針變量指向了一個值的內存地址。類似於變量和常量,在使用指針前你需要聲明指針。指針聲明格式如下:
--在指針類型前面加上 * 號(前綴)來獲取指針所指向的內容。--
var var_name *var-type
func main() {
	//var ip *int        // 指向整型的空指針
	//var fp *float32    // 指向浮點型的空指針

	a := 10
	var ip *int			 //定義一個指針變量

	ip = &a				 //指向a的內存地址
	fmt.Printf("a 變量的地址是: %x\n", &a  )

    /* 指針變量的存儲地址 */
    fmt.Printf("ip 變量儲存的指針地址: %x\n", ip )

    /* 使用指針訪問值 */
    fmt.Printf("*ip 變量的值: %d\n", *ip )
}
//結果為
a 變量的地址是: c000014078
ip 變量儲存的指針地址: c000014078
*ip 變量的值: 10

(五)范圍range

 

package main

import "fmt"

type person struct{
    name string
    age int
    ismarry bool
}

func main() {
    numSlice := []int{1,3,2,3}
    nums := 0
    for _,val := range numSlice {
        nums += val
    }
    fmt.Println("nums:", nums)
    //這個是index
    for i, num := range numSlice {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }
    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }
    //range也可以用來枚舉Unicode字符串。第一個參數是字符的索引,第二個是字符(Unicode的值)本身。
    for i, c := range "go" {
        fmt.Println(i, c)
    }


}

(六)接口

1. 什么是interface接口

  interface 是GO語言的基礎特性之一。可以理解為一種類型的規范或者約定。它跟java,C# 不太一樣,不需要顯示說明實現了某個接口,它沒有繼承或子類或“implements”關鍵字,只是通過約定的形式,隱式的實現interface 中的方法即可。因此,Golang 中的 interface 讓編碼更靈活、易擴展。

  如何理解go 語言中的interface ? 只需記住以下三點即可:

    1. interface 是方法聲明的集合
    2. 任何類型的對象實現了在interface 接口中聲明的全部方法,則表明該類型實現了該接口。
    3. interface 可以作為一種數據類型,實現了該接口的任何對象都可以給對應的接口類型變量賦值。

 

  注意:
    a. interface 可以被任意對象實現,一個類型/對象也可以實現多個 interface
    b. 方法不能重載,如 eat() eat(s string) 不能同時存在

package main

import "fmt"

type Person interface {
	car()
}
type Women struct{}

func (women Women) car() {
	fmt.Println("女人開車")
}

type Man struct{}

func (man Man) car() {
	fmt.Println("男人開車")
}

func main() {
	var person Person
	person = new(Women)
	person.car()
	person = new(Man)
	person.car()
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM