golang實現PHP數組特性的方法

前言

我們做業務過程中,對應強類型語言使用有個痛點,就是使用變量之前一定要定義變量類型,比如c,c++,golang等,弱類型語言擇不需要,可以直接讀寫,比如php。下面通過php和golang語言舉例說明,對於強弱類型語言變量類型的使用情況,並提出自己的解決方案databox。

內容

復雜結構處理

1. php 處理復雜結構

1.1 讀取值

<?php
$country = [
    "china"=>[
            "陜西"=>["西安市","寶雞市","渭南市"],
            "北京"=>["朝陽區","海淀區","通州區"]
    ],
];

print_r($country["china"]["陜西"][0]);

打印結果
西安市

1.2 寫入值

<?php
$country = [
    "china"=>[
        "陜西"=>["西安市","寶雞市","渭南市"],
        "北京"=>["朝陽區","海淀區","通州區"]
    ],
];

$country["美國"]["紐約州"][0] = "紐約";

var_dump($country);

打印結果
array(3) {
  [“china”]=>
  array(2) {
    [“陜西”]=>
    array(3) {
      [0]=>
      string(9) “西安市”
      [1]=>
      string(9) “寶雞市”
      [2]=>
      string(9) “渭南市”
    }
    [“北京”]=>
    array(3) {
      [0]=>
      string(9) “朝陽區”
      [1]=>
      string(9) “海淀區”
      [2]=>
      string(9) “通州區”
    }
  }
  [“america”]=>
  array(0) {
  }
  [“美國”]=>
  array(1) {
    [“紐約州”]=>
    array(1) {
      [0]=>
      string(6) “紐約”
    }
  }
}

說明

  • php操作數組的時候,不需要考慮對應的下標值是否存在,可以直接使用。

2. golang 處理復雜結構

2.1 讀取值

package main

import "fmt"

func main() {
   country := map[string]interface{}{
      "china": map[string]interface{}{
         "陜西": []interface{}{"西安市", "寶雞市", "渭南市"},
         "寶雞": []interface{}{"朝陽區", "海淀區", "通州區"},
      },
   }

   china := country["china"] //第一步
   shanxi := china.(map[string]interface{})["陜西"] //第二步
   xian := shanxi.([]interface{}) //第三步
   fmt.Println(xian[0])
}

打印結果
西安市

分三步

  • 第一步 創建變量china 值為country變量key為“china”對應的值
  • 第二步 創建變量shanxi 隻對china變量key為“陜西”對應的值,其中對於china使用瞭斷言
  • 第三步 創建xian 變量,取值為shanxi對於下標為0的值,其中對於shanxi使用瞭斷言

因為對象有三層,所以用瞭三步,每次取一層數據,然後斷言在取第二層數據,接著又斷言,同理如果對象有N層,獲取N層的值,需要N步。
2.2 寫入值

package main

import "fmt"

func main() {
   country := map[string]interface{}{
      "中國": map[string]interface{}{
         "陜西": []interface{}{"西安市", "寶雞市", "渭南市"},
         "寶雞": []interface{}{"朝陽區", "海淀區", "通州區"},
      },
   }

   city := []interface{}{"紐約"} //第一步
   province := map[string]interface{}{"紐約州": city} //第二步
   country["美國"] = province //第三步
   fmt.Println(country)
}

打印結果
map[中國:map[寶雞:[朝陽區 海淀區 通州區] 陜西:[西安市 寶雞市 渭南市]] 美國:map[紐約州:[紐約]]]

說明 需要在country下寫入美國,紐約州,下面為紐約的數據。
分三步

  • 第一步 先創建紐city數組,第一個索引對應為“紐約”
  • 第二步 創建province map對象,元素為key為“紐約州”值為city數組
  • 第三步 將country 寫入key“美國”,值為province 對象

因為要寫入的數據處在第三層,所有需要三步,才能賦值完成,如果對象為N層,需要在N層寫入數據,所有需要N步

3. dataBox 復雜結構處理

  • api層:提供初始化函數NewDataBox,get,getString,getMap 獲取變量為瞭函數,set 寫入變量函數
  • 數據處理引擎層:負責修改和讀取數據
  • 數據存儲層:負責保存數據

3.1 讀數據

package main

import (
   "fmt"
   "github.com/codewangz/goutils/databox"
)

func main() {
   country := map[string]interface{}{
      "中國": map[string]interface{}{
         "陜西": []interface{}{"西安市", "寶雞市", "渭南市"},
         "寶雞": []interface{}{"朝陽區", "海淀區", "通州區"},
      },
   }

   dbx := databox.NewDataBox(country)
   xian := dbx.GetString("中國.陜西.0")
   fmt.Println(xian)
}

打印結果
西安

通過GetString 傳入key “中國.陜西.0”,直接就可以獲取對應的值“西安”,隻有一步操作。

3.2 寫數據

package main

import (
   "fmt"
   "github.com/codewangz/goutils/databox"
)

func main() {
   country := map[string]interface{}{
      "中國": map[string]interface{}{
         "陜西": []interface{}{"西安市", "寶雞市", "渭南市"},
         "寶雞": []interface{}{"朝陽區", "海淀區", "通州區"},
      },
   }

   dbx := databox.NewDataBox(country)
   dbx.Set("美國.紐約州.0", "紐約")
   fmt.Println(dbx.Data())
}

打印結果
map[中國:map[寶雞:[朝陽區 海淀區 通州區] 陜西:[西安市 寶雞市 渭南市]] 美國:map[紐約州:[紐約]]]

使用set方法直接對應key“美國.紐約州.0”寫入對應的值就可以。

總結

  • 弱類型語言php可以直接對數值讀寫,不需要提前知道變量類型,也不需要知道變量內部構造
  • 強類型語言golang不能直接讀寫數據,需要對數據類型進行斷言,才能寫入,需要知道變量內部構造

到此這篇關於golang實現PHP數組特性的方法的文章就介紹到這瞭,更多相關golang實現PHP數組特性內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: