在Go語言中,可以這樣使用Json

在Go語言中,處理JSON數據通常涉及編碼(將Go結構體轉換為JSON字符串)和解碼(將JSON字符串轉換為Go結構體)。Go標準庫中的encoding/json包提供了這些功能。第三方插件可以使用"github.com/goccy/go-json"也有同樣的功能

?Marshal函數將會遞歸遍歷整個對象,依次按成員類型對這個對象進行編碼,類型轉換規則如下:

  • bool類型 轉換為JSONBoolean

  • 整數,浮點數等數值類型 轉換為JSONNumber

  • string?轉換為JSON的字符串(帶""引號)

  • struct?轉換為JSONObject,再根據各個成員的類型遞歸打包

  • 數組或切片 轉換為JSONArray

  • []byte?會先進行base64編碼然后轉換為JSON字符串

  • map轉換為JSONObjectkey必須是string

  • interface{}?按照內部的實際類型進行轉換

  • nil?轉為JSONnull

  • channel,func等類型 會返回UnsupportedTypeError

?1、使用標準庫中的encoding/json

字符串輸出&格式化輸出&解碼

package mainimport ("encoding/json""fmt"
)type ColorGroup struct {ID     intName   stringColors []string
}// 創建一個ColorGroup類型的變量來保存解碼后的數據
var decodedGroup ColorGroupfunc main() {group := ColorGroup{ID:     1,Name:   "Reds",Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},}// 將結構體編碼為JSON字符串jsonData1, err := json.Marshal(group)jsonData2, err := json.MarshalIndent(group, "", "	")if err != nil {fmt.Println("error:", err)return}// 打印JSON字符串fmt.Println(string(jsonData1))fmt.Println(string(jsonData2))// Output://{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}//	{//		"ID": 1,//		"Name": "Reds",//		"Colors": [//			"Crimson",//			"Red",//			"Ruby",//			"Maroon"//		]//	}// 將JSON字符串解碼到ColorGroup結構體中err = json.Unmarshal([]byte(jsonData1), &decodedGroup)if err != nil {fmt.Println("error:", err)return}// 打印解碼后的數據fmt.Printf("ID: %d, Name: %s, Colors: %v\n", decodedGroup.ID, decodedGroup.Name, decodedGroup.Colors)// Output: ID: 1, Name: Reds, Colors: [Crimson Red Ruby Maroon]fmt.Println(decodedGroup.Colors[0])fmt.Println(decodedGroup.Colors[1])
}

?2、使用第三方包

標準輸出&格式化輸出&解碼

package mainimport ("fmt""github.com/goccy/go-json""os"
)type ColorGroup struct {ID     intName   stringColors []string
}func main() {group := ColorGroup{ID:     1,Name:   "Reds",Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},}b1, err := json.Marshal(group)if err != nil {fmt.Println("error:", err)}println(os.Stdout.Write(b1)) //os.Stdout.Write(b1)將字節切片b(即JSON字符串的字節表示)寫入到標準輸出fmt.Println("---------------格式化輸出----------------")// 使用 MarshalIndent 來格式化輸出b2, err := json.MarshalIndent(group, "", "  ") // 第二個參數是空字符串,表示不添加前綴;第三個參數是縮進字符串if err != nil {fmt.Println("error:", err)return}// 使用 fmt.Println 來打印字符串// MarshalIndent返回的是字節切片,我們需要使用string(b2)來將其轉換為字符串fmt.Println(string(b2)) // 將字節切片轉換為字符串并打印// 輸出將會是格式化后的 JSON 字符串// 創建一個ColorGroup類型的變量來保存解碼后的數據var decodedGroup ColorGroup// 將JSON字符串解碼到ColorGroup結構體中err = json.Unmarshal([]byte(b1), &decodedGroup)if err != nil {fmt.Println("error:", err)return}// 打印解碼后的數據fmt.Printf("ID: %d, Name: %s, Colors: %v\n", decodedGroup.ID, decodedGroup.Name, decodedGroup.Colors)// Output: ID: 1, Name: Reds, Colors: [Crimson Red Ruby Maroon]fmt.Println(decodedGroup.Colors[0])fmt.Println(decodedGroup.Colors[1])
}

請注意,在解碼時,你需要將JSON字符串轉換為[]byte,并且傳入結構體的指針(使用&)。這樣,解碼后的數據才會被寫入到結構體中?

3、decode??

package mainimport ("fmt""github.com/goccy/go-json"
)// Animal 定義結構體來表示單個JSON對象
type Animal struct {Name  stringOrder string
}func main() {//創建一個JSON字節切片var jsonBlob = []byte(`[   {"Name": "Platypus", "Order": "Monotremata"},   {"Name": "Quoll", "Order": "Dasyuromorphia"}   ]`)var animals []Animalerr := json.Unmarshal(jsonBlob, &animals)if err != nil {fmt.Println("error:", err)}fmt.Printf("%+v", animals)fmt.Println()// 打印解碼后的數據for _, animal := range animals {fmt.Printf("Name: %s, Order: %s\n", animal.Name, animal.Order)}
}

4、注意

結構體

結構體必須是大寫字母開頭的成員才會被JSON處理到,小寫字母開頭的成員不會有影響。

Mashal時,結構體的成員變量名將會直接作為JSON?Objectkey打包成JSONUnmashal時,會自動匹配對應的變量名進行賦值,大小寫不敏感。

Unmarshal時,如果JSON中有多余的字段,會被直接拋棄掉;如果JSON缺少某個字段,則直接忽略不對結構體中變量賦值,不會報錯

package mainimport ("encoding/json""fmt"
)type Message struct {Name  stringBody  stringTime  int64inner string
}func main() {var m = Message{Name:  "Alice",Body:  "Hello",Time:  1294706395881547000,inner: "ok",}b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`)err := json.Unmarshal(b, &m)if err != nil {fmt.Printf(err.Error())return}fmt.Printf("%v", m)//Output: {Bob Hello 1294706395881547000 ok}
}
StructTag/結構體標簽

如果希望手動配置結構體的成員和JSON字段的對應關系,可以在定義結構體的時候給成員打標簽:

使用omitempty熟悉,如果該字段為nil或0值(數字0,字符串"",空數組[]等),則打包的JSON結果不會有這個字段。

案例一
package mainimport ("encoding/json""fmt"
)type Message struct {Name string `json:"msg_name"`       // 對應JSON的msg_nameBody string `json:"body,omitempty"` // 如果為空置則忽略字段Time int64  `json:"-"`              // 直接忽略字段
}func main() {var m = Message{Name: "Alice",Body: "",Time: 1294706395881547000,}data, err := json.Marshal(m)if err != nil {fmt.Printf(err.Error())return}fmt.Println(string(data))//Output:{"msg_name":"Alice"}
}
案例二?
package mainimport ("encoding/json""fmt""log""time"
)// 定義一個用于JSON映射的結構體
type User struct {Name     string     `json:"username"` // 自定義字段名稱映射Email    string     `json:"email"`LastSeen CustomTime `json:"last_seen"` // 嵌套對象Active   bool       `json:"-"`         // 忽略此字段,即使JSON中存在也不解碼
}// CustomTime 是一個用于表示時間的結構體
type CustomTime struct {time.Time
}// 實現 json.Unmarshaler 接口的 UnmarshalJSON 方法
func (ct *CustomTime) UnmarshalJSON(data []byte) error {var s stringif err := json.Unmarshal(data, &s); err != nil {return err}// 解析自定義時間格式parsedTime, err := time.Parse(time.RFC3339, s)if err != nil {return err}ct.Time = parsedTimereturn nil
}func main() {// 模擬從HTTP請求中獲取的JSON數據jsonData := []byte(`{"username": "johndoe","email": "john.doe@example.com","last_seen": "2023-04-01T12:34:56Z","active": true}`)// 創建一個 User 實例var user User// 使用 json.Unmarshal 解碼 JSON 數據if err := json.Unmarshal(jsonData, &user); err != nil {log.Fatal("Error unmarshaling JSON:", err)}// 打印解碼后的信息fmt.Printf("Name: %s\n", user.Name)fmt.Printf("Email: %s\n", user.Email)fmt.Printf("Last Seen: %v\n", user.LastSeen)// Active 字段將不會被解碼,即使JSON中存在fmt.Printf("Active: %v\n", user.Active)//輸出://Name: johndoe//Email: john.doe@example.com//	Last Seen: 2023-04-01 12:34:56 +0000 UTC//Active: false
}

5、更靈活地使用JSON

使用json.RawMessage

json.RawMessage其實就是[]byte類型的重定義。可以進行強制類型轉換。

現在有這么一種場景,結構體中的其中一個字段的格式是未知的:

type Command struct {ID   intCmd  stringArgs *json.RawMessage
}

使用json.RawMessage的話,Args字段在Unmarshal時不會被解析,直接將字節數據賦值給Args。我們可以能先解包第一層的JSON數據,然后根據Cmd的值,再確定Args的具體類型進行第二次Unmarshal

這里要注意的是,一定要使用指針類型*json.RawMessage,否則在Args會被認為是[]byte類型,在打包時會被打包成base64編碼的字符串。

案例一
package mainimport ("encoding/json""fmt""log"
)type Command struct {ID   intCmd  stringArgs *json.RawMessage // 未解析的JSON片段
}func main() {//json字節切片jsonData := []byte(`{  "ID": 1,  "Cmd": "example",  "Args": ["arg1", "arg2"]  }`)var cmd Command//解碼/反序列化if err := json.Unmarshal(jsonData, &cmd); err != nil {log.Fatalf("Error unmarshaling JSON: %v", err)}fmt.Printf("Command: %+v\n", cmd)// 如果需要,可以進一步處理cmd.Args字段// 例如,將其解析為特定的Go類型var args []stringif err := json.Unmarshal(*cmd.Args, &args); err != nil {log.Printf("解析錯誤: %v", err)} else {fmt.Printf("Args: %v\n", args)}//輸出//Command: {ID:1 Cmd:example Args:0xc0000080f0}//Args: [arg1 arg2]
}
案例二
package mainimport ("encoding/json""fmt""log"
)type Command struct {ID   intCmd  stringArgs *json.RawMessage // 未解析的JSON片段
}// UnmarshalJSON 自定義JSON解碼方法,Command實現了Unmarshaler接口
func (c *Command) UnmarshalJSON(data []byte) error {fmt.Println("--------------使用自定義解碼--------------")// 定義一個輔助結構體,用于解碼除Args外的其他字段type alias Commandvar aux struct {alias // 嵌入別名類型以獲取其他字段}// 先解碼除Args外的所有字段if err := json.Unmarshal(data, &aux); err != nil {return err}fmt.Printf("Command ID: %+v, Cmd: %+v\n", aux.alias.ID, aux.alias.Cmd)// 將別名結構體中的字段復制到c中*c = Command(aux.alias)// 檢查JSON中是否有Args字段,并處理它var m map[string]json.RawMessageif err := json.Unmarshal(data, &m); err != nil {// 如果這里出錯,可能是因為JSON格式不正確,但我們可能仍然想要保留已經解析的字段// 因此,我們可以只記錄一個錯誤,但不返回它log.Printf("Error parsing Args field: %v", err)} else {// 如果Args字段存在,將其賦值給c.Argsif rawArgs, ok := m["Args"]; ok {c.Args = &rawArgs // 注意這里我們取了rawArgs的地址var args []stringif err := json.Unmarshal(*c.Args, &args); err != nil {log.Printf("Error parsing Args contents: %v", err)} else {fmt.Printf("Args: %v\n", args)}}}// 如果沒有錯誤,返回nilreturn nil
}func main() {//json字節切片jsonData := []byte(`{  "ID": 1,  "Cmd": "example",  "Args": ["arg1", "arg2"]  }`)var cmd Command//解碼/反序列化if err := json.Unmarshal(jsonData, &cmd); err != nil {log.Fatalf("Error unmarshaling JSON: %v", err)}
}
案例三?
package mainimport ("encoding/json""fmt""log"
)type Command struct {ID   intCmd  stringArgs *json.RawMessage // 未解析的JSON片段
}// UnmarshalJSON 自定義JSON解碼方法,Command實現了Unmarshaler接口
func (c *Command) UnmarshalJSON(data []byte) error {fmt.Println("--------------使用自定義解碼--------------")// 檢查JSON中是否有Args字段,并處理它var m map[string]json.RawMessageif err := json.Unmarshal(data, &m); err != nil {// 如果這里出錯,可能是因為JSON格式不正確,但我們可能仍然想要保留已經解析的字段// 因此,我們可以只記錄一個錯誤,但不返回它log.Printf("Error parsing Args field: %v", err)} else {// 如果Args字段存在,將其賦值給c.Argsif rawArgs, ok := m["Args"]; ok {c.Args = &rawArgs // 注意這里我們取了rawArgs的地址var args []stringif err := json.Unmarshal(*c.Args, &args); err != nil {log.Printf("Error parsing Args contents: %v", err)} else {fmt.Printf("Args: %v\n", args)}}}// 如果沒有錯誤,返回nilreturn nil
}func main() {//json字節切片jsonData := []byte(`{  "ID": 1,  "Cmd": "example",  "Args": ["arg1", "arg2"]  }`)var cmd Command//解碼/反序列化if err := json.Unmarshal(jsonData, &cmd); err != nil {log.Fatalf("Error unmarshaling JSON: %v", err)}
}

?調用的json.Unmarshal,并不是調用json.Unmarshaler,為什么會調用UnmarshalJSON

調用?json.Unmarshal?函數時,您并沒有直接調用?json.Unmarshaler?接口的方法。但是,json.Unmarshal?函數在內部會檢查目標類型是否實現了?json.Unmarshaler?接口。如果實現了該接口,json.Unmarshal?就會使用您為該類型定義的?UnmarshalJSON?方法來解碼 JSON 數據。

這是?json.Unmarshal?函數內部邏輯的一部分,用于確定如何解碼 JSON 數據。具體步驟如下:

  1. json.Unmarshal?接收一個字節切片(包含 JSON 數據)和一個目標值的指針。
  2. 它首先會檢查目標值的類型是否實現了?json.Unmarshaler?接口。
  3. 如果實現了?json.Unmarshaler?接口,json.Unmarshal?就會調用該類型的?UnmarshalJSON?方法,并將 JSON 數據的字節切片作為參數傳遞給它。
  4. 如果目標值沒有實現?json.Unmarshaler?接口,json.Unmarshal?就會使用默認的解碼邏輯來填充目標值的字段。

這種機制使得開發者能夠靈活地控制 JSON 數據到 Go 結構體之間的轉換過程。通過實現?json.Unmarshaler?接口,您可以:

  • 處理 JSON 數據中不存在的字段。
  • 自定義字段名稱的映射規則。
  • 處理 JSON 數據中的嵌套對象或數組。
  • 執行額外的驗證或數據處理邏輯。

以下是簡單的示例,展示了如何為一個類型實現?json.Unmarshaler?接口

處理 JSON 數據中不存在的字段

假設我們有一個結構體,它能夠處理JSON中可能缺失的字段,并且為這些字段提供默認值。?

在這個例子中,Age 字段在JSON中不存在,因此它將被賦予其類型的零值(對于int類型是0)。

package mainimport ("encoding/json""fmt""log"
)type User struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email,omitempty"`
}func main() {var user User// JSON 中沒有 "age" 字段,將使用 Age 的零值 0jsonData := []byte(`{"name": "John", "email": "john@example.com"}`)if err := json.Unmarshal(jsonData, &user); err != nil {log.Fatal(err)}fmt.Printf("Name: %s, Age: %d, Email: %s\n", user.Name, user.Age, user.Email)//Name: John, Age: 0, Email: john@example.com
}

?自定義字段名稱的映射規則

使用結構體標簽中的json鍵來指定JSON字段名。

在這個例子中,結構體的字段名和JSON字段名不匹配,我們通過在結構體標簽中指定json來實現映射。

package mainimport ("encoding/json""fmt""log"
)type User struct {Username string `json:"user_name"`Password string `json:"pass"`
}func main() {var user UserjsonData := []byte(`{"user_name": "johndoe", "pass": "secret"}`)if err := json.Unmarshal(jsonData, &user); err != nil {log.Fatal(err)}fmt.Printf("Username: %s, Password: %s\n", user.Username, user.Password)//Username: johndoe, Password: secret
}

?處理 JSON 數據中的嵌套對象或數組

解碼一個包含嵌套結構體的JSON數據。

在這個例子中,Address 是一個嵌套在 User 結構體中的對象。

package mainimport ("encoding/json""fmt""log"
)type Address struct {City    string `json:"city"`Country string `json:"country"`
}type User struct {Name    string  `json:"name"`Address Address `json:"address"` // 嵌套對象
}func main() {var user UserjsonData := []byte(`{"name": "Jane", "address": {"city": "New York", "country": "USA"}}`)if err := json.Unmarshal(jsonData, &user); err != nil {log.Fatal(err)}fmt.Printf("Name: %s, Lives in %s, %s\n", user.Name, user.Address.City, user.Address.Country)//Name: Jane, Lives in New York, USA
}

?執行額外的驗證或數據處理邏輯

UnmarshalJSON方法中添加額外的驗證邏輯。

在這個例子中,我們為User類型實現了自定義的UnmarshalJSON方法。在解碼過程中,如果Age字段的值是負數,將返回一個錯誤,這是一個額外的驗證邏輯。

package mainimport ("encoding/json""fmt""log"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func (u *User) UnmarshalJSON(data []byte) error {type Alias User                         // 影子類型,避免遞歸調用 UnmarshalJSONaux := &Alias{Name: u.Name, Age: u.Age} // 使用輔助結構體來解耦if err := json.Unmarshal(data, aux); err != nil {return err}*u = User(*aux) // 將解耦的結構體賦值給當前結構體if u.Age < 0 {  //年齡不能為負數return fmt.Errorf("age cannot be negative")}return nil
}func main() {var user UserjsonData := []byte(`{"name": "Alice", "age": -5}`)if err := json.Unmarshal(jsonData, &user); err != nil {log.Fatal(err)}fmt.Printf("Name: %s, Age: %d\n", user.Name, user.Age)
}

?在上面的示例中,User類型實現了?json.Unmarshaler?接口的?UnmarshalJSON?方法,使得?json.Unmarshal?函數在解碼 JSON 數據時會調用這個方法,而不是使用默認的解碼邏輯。這允許我們自定義解碼邏輯,例如只接受特定格式的 JSON 數據。?

?使用interface{}

interface{}類型在Unmarshal時,會自動將JSON轉換為對應的數據類型:

JSON的boolean?轉換為bool
JSON的數值?轉換為float64
JSON的字符串?轉換為string
JSON的Array?轉換為[]interface{}
JSON的Object?轉換為map[string]interface{}
JSON的null?轉換為nil

需要注意的有兩個。一個是所有的JSON數值自動轉換為float64類型,使用時需要再手動轉換為需要的intint64等類型。第二個是JSONobject自動轉換為map[string]interface{}類型,訪問時直接用JSON ``Object的字段名作為key進行訪問。再不知道JSON數據的格式時,可以使用interface{}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11832.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git | git log 和 git status 的區別

如是我聞&#xff1a; git log和git status是Git中的兩個非常有用的命令&#xff0c;它們用于不同的目的&#xff0c;并提供不同類型的信息。 git log git log命令用于顯示一個或多個分支的提交歷史記錄。這個命令會列出提交歷史&#xff0c;包括每次提交的SHA-1哈希值、提交…

程控水冷阻性負載主要工作方式

程控水冷阻性負載是一種先進的電力設備&#xff0c;主要用于電力系統的測試和研究。它的主要工作方式是通過控制水冷系統的溫度&#xff0c;來模擬不同的阻性負載條件&#xff0c;從而對電力設備進行各種性能測試。 首先&#xff0c;我們需要了解什么是阻性負載。阻性負載是指那…

博弈智能的特點

博弈智能是指通過算法和模型對博弈過程進行分析和決策的智能系統。在博弈中&#xff0c;各方參與者追求自身利益和目標&#xff0c;會采取各種策略來達到自己的目標。其中&#xff0c;包括了一些不正當手段&#xff0c;如詭計和欺騙&#xff08;詭&#xff09;&#xff08;詐&a…

代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集

代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集 文章目錄 代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集01背包問題理論基礎一、01背包問題二、…

WSL設置啟動時自動啟動docker服務或其他服務

方式一: Windows系統的WSL,當windows關機再開機后,WSL等于是重新開機的,默認情況下,不會啟動Docker服務。例如在Ubuntu 22.04中,需要使用命令 service docker start來啟動。由于我習慣關機斷電,因此每天開機打開WSL后都要手動輸入這個命令,非常麻煩。所以找了一個方法…

Redis教程——哨兵

在上篇文章我們學習了Redis教程——主從復制&#xff0c;這篇文章我們學習Redis教程——哨兵監控。 在主從復制中如果主機發生宕機&#xff0c;從機Redis會一直等到主機的恢復&#xff0c;這樣會導致只能進行讀操作&#xff0c;不能進行寫操作&#xff0c;這大大降低了系統的高…

資料同化 | 搭建docker環境-1

Community Gridpoint Statistical Interpolation (GSI) system DTC 是一個分布式設施&#xff0c;NWP 社區可以在這里測試和評估用于研究和操作的新模型和技術。 DTC的目標包括&#xff1a; 鏈接研究和操作社區 研究成果轉化為實際操作的速度 加快改善天氣預報 開發和測試有…

Cocos Creator 3.8.x 透明帶滾動功能的容器

ScrollView 是一種帶滾動功能的容器 1、刪除ScrollView下Sprite組件的SpriteFrame 2、ScrollView下scrollBar的Sprite組件的Color設為&#xff1a;FFFFFF00 3、ScrollView下view的Graphics組件的FillColor設為&#xff1a;FFFFFF00

IP代理如何幫助SEO進行優化?

IP代理在SEO優化中扮演著重要的角色&#xff0c;它通過多種方式幫助提升網站的搜索排名和可見性。以下是IP代理如何幫助SEO進行優化的詳細闡述&#xff1a; 第一點&#xff0c;數據采集與分析&#xff1a;在SEO過程中&#xff0c;大量的數據是必不可少的。通過使用IP代理&…

如何區分os.walk()與os.scandir()

os.walk() import os for dirpath, dirname, files in os.walk(./):# dirpath 當前——路徑# dirname 當前——路徑——下——文件夾名——列表# files 當前——路徑——下——文件——列表dirpath 當前路徑 ./ dirname 當前路徑下面文件夾名稱組成的列表&#xff0c;共3個文…

c++ std::shared_ptr學習

背景 c中智能指針shared_ptr用于自動管理資源&#xff0c;通過引用計數來記錄資源被多少出地方使用。在不使用資源時&#xff0c;減少引用計數&#xff0c;如果引用計數為0&#xff0c;表示資源不會再被使用&#xff0c;此時會釋放資源。本文記錄對c中std::shared_ptr的源碼學習…

攻防世界PHP2

1、打開靶機鏈接http://61.147.171.105:49513/&#xff0c;沒有發現任何線索 2、嘗試訪問http://61.147.171.105:49513/index.php&#xff0c;頁面沒有發生跳轉 3、嘗試將訪問 嘗試訪問http://61.147.171.105:49513/index.phps index.php 和 index.phps 文件之間的主要區別在于…

GNU Radio創建時間戳 C++ OOT塊

文章目錄 前言一、創建自定義的 C OOT 塊1、創建 timestamp_sender C OOT 模塊①、創建 timestamp_sender OOT 塊②、修改 C 代碼 2、創建 timestamp_receiver C OOT 模塊①、創建 timestamp_receiver OOT 塊②、修改 C 代碼 3、創建 delayMicroSec C OOT 模塊①、創建 delayMi…

Vue3實戰筆記(20)—封裝頭部導航組件

文章目錄 前言一、封裝頭部導航欄二、使用步驟總結 前言 Vue 3 封裝頭部導航欄有助于提高代碼復用性、統一風格、降低維護成本、提高可配置性和模塊化程度&#xff0c;同時還可以實現動態渲染等功能&#xff0c;有利于項目開發和維護。 一、封裝頭部導航欄 封裝頭部導航欄&am…

HFSS學習-day4-建模操作

通過昨天的學習&#xff0c;我們已經熟悉了HFSS的工作環境&#xff1b;今天我們來講解HFSS中創建物體模型的縣體步驟和相關操作。物體建模是HFSS仿真設計工作的第一步&#xff0c;HFSS中提供了諸如矩形、圓面、長方體圓柱體和球體等多種基本模型(Primitive)&#xff0c;這些基本…

新書速覽|MATLAB科技繪圖與數據分析

提升你的數據洞察力&#xff0c;用于精確繪圖和分析的高級MATLAB技術。 本書內容 《MATLAB科技繪圖與數據分析》結合作者多年的數據分析與科研繪圖經驗&#xff0c;詳細講解MATLAB在科技圖表制作與數據分析中的使用方法與技巧。全書分為3部分&#xff0c;共12章&#xff0c;第1…

tp8 設置空控制器和空方法

1、空控制器 單應用模式下&#xff0c;我們可以給項目定義一個Error控制器類 <?phpnamespace app\controller;class Error {/*** 空控制器中重寫魔術方法__call可以實現自定義錯誤提示&#xff0c;在這里可以提示找不到控制器* 注意&#xff1a;在基礎控制器BaseControll…

精英都是時間控!職場精英的完美一天~~~谷歌FB都在用的時間管理術!

如何超高效使用24小時 每個人的一天都只有24小時&#xff0c;使用時間的方法將決定整個人生。時間管理術并不提倡把自己忙死榨干&#xff0c;而是通過在合適的時間做合適的事情&#xff0c;把大腦機能發揮到極致&#xff0c;從而提高效率&#xff0c;節省下更多時間用于生活與…

(項目)-KDE巡檢報告(模板

金山云于12月26日對建行共計【30】個KDE集群,合計【198】臺服務器進行了巡檢服務。共發現系統風險【135】條,服務風險【1912】條,服務配置風險【368】條。 一、系統風險 1、風險分析(圖片+描述) (1)磁盤使用率高 問題描述多個集群的多臺服務器磁盤使用率較高,遠超過…

答辯PPT模版如何選擇?aippt快速生成

這些網站我愿稱之為制作答辯PPT的神&#xff01; 很多快要畢業的同學在做答辯PPT的時候總是感覺毫無思路&#xff0c;一竅不通。但這并不是你們的錯&#xff0c;對于平時沒接觸過相關方面&#xff0c;第一次搞答辯PPT的人來說&#xff0c;這是很正常的一件事。一個好的答辯PPT…