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.
	}
}
posted on 2018-08-28 10:48  scala  阅读(415)  评论(0编辑  收藏  举报