go語言學習四 - 複合文面量聲明

package main

import (
	"encoding/json"
	"fmt"
	"reflect"
)

func main() {
	//go語言的複合大括號文面量聲明很是強大和靈活 ,只要在最外層聲明完整的複合類型在大括號內部就不須要再聲明類型而直接用大括號了

	a := [][]int{
		{1, 2, 3, 4}, //這裏沒必要再用 []int{1,2,3,4} 聲明,若是用的話編譯器提示冗餘的類型聲明(Redundant type declaration)
		{5, 6, 7, 8}} //多行的複合類型聲明最後一行大括號換行前須要加一個逗號,或者最後一個大括號不換行也行

	//很方便的聲明一個比較經常使用的相似java的List<Map<String,String>>結構
	var list = []map[string]string{
		{"name": "wengmj", "id": "1"},
		{"name": "chengp", "id": "2"}, //這裏結尾必須加一個 "奇怪的逗號",若是想不加這個逗號最後一個大括號不換行便可
	} //若是大括號換行前不加逗號編譯器報錯:Need trailing comma before newline in composite literal

	fmt.Println(a)
	fmt.Println(reflect.TypeOf(a)) // 能夠用 reflect.TypeOf(a) 得到 變量的類型 , 這個類型的類型是 Type (*reflect.rtype)
	 // 若是僅僅爲了顯示類型的字符串名稱 則能夠用  fmt.Sprintf("%T",a)

	//將這個經常使用的結構轉換爲 json
	if data, err := json.Marshal(list); err == nil {
		fmt.Printf("%s\n", data)
		// json.Marshal(v interface{}} (byte[],error)
		// 因此直接打印顯式的是 byte[] , 還能夠用 fmt.Println(string(data)) 將字節數組轉換爲 string
	}

	type emp struct {
		Id   int    //結構體字段名須要首字母大寫,不然轉 json 返回空屬性
		Name string //由於 json 序列化 包在本包以外,須要本包結構體屬性對包外輸出的公有屬性
	}

	//結構體切片的初始化也能夠很方便的在內部直接用嵌套大括號實現,無需內部再用結構體構建方法
	var emps = []emp{{1, "wengmj"}, {2, "chengp"}}
	if data, err := json.Marshal(emps); err == nil {
		fmt.Printf("json: %s\n", data)
	}

	//與上面的逗號規則相同
	x := [4]float32{1, 2, 3, 4} //聲明和初始化整數數組

	y := []float32{1, 2, 3, 4} //聲明和初始化整數切片

	z := map[string]float32{"a": 1, "b": 2,
		"z": 3} //聲明和初始化map[string]float32

	fmt.Println(x[0] + y[0] + z["b"])

	////////////////////////// go語言的字符

	c := 'h'
	fmt.Println(c) // 直接打印 go 的字符顯示 byte 或 rune 的值,這裏顯示 97

	s := '好' //go 語言中的字符是 byte(uint8) 類型 或 rune(int32) 這裏顯示 22909
	fmt.Println(s)

	p := "hello world"

	if p[0] == 'h' { //字符直接打印顯示的是數字,可是字符之間能夠直接象數字同樣比較
		fmt.Println("ok") // 這裏也能夠直接寫 p[0] == 104
		println("ok")
		//不要使用println這個內置函數輸出,源碼註釋:println is useful for bootstrapping and debugging;
		// it is not guaranteed to stay in the language.
	}
}
相關文章
相關標籤/搜索