- 目錄 -
結構體
尚硅谷Golang課

結構體

type Cat struct {
	Name  string
	Age   int
	Color string
	// S1    []int //可以是切片 但是預設值為nil(沒分配空間,一樣要先make後才能用)
}

//結構體是一個值類型,預設是值拷貝,比如cat1跟cat2是獨立存在兩個空間

func main() {
	//創建Cat的變量
	var cat1 Cat
	cat1.Name = "小花"
	cat1.Age = 18
	cat1.Color = "花"
	fmt.Println("cat1=", cat1)
	// cat1.S1 = make([]int, 10)
	// cat1.S1[0] = 100
	// fmt.Println("cat1=", cat1)

	//推薦方式
	cat2 := Cat{"小黑", 5, "black"}
	fmt.Println(cat2)

	//方法3
	//var c *C=new(C)
	var cat3 *Cat = new(Cat)
	//因為cat3是一個指針
	(*cat3).Name = "小白"
	//語法糖 cat3.Age也可以 ,不建議
	cat3.Age = 6
	fmt.Println(*cat3)

	//方法4
	//var c *C=&C{}
	//因為c是一個指針 本來應該要用*...但是不用也行 草
	var cat4 *Cat = &Cat{"阿皇", 0, "Yellow"}
	cat4.Name = "阿煌"
	(*cat4).Age = 1
	fmt.Println(*cat4)

	type Person struct {
		Name string `json:"name"`
		Age  int    `json:"age"`
	}

	p1 := Person{"aaa", 10}
	fmt.Println(p1)
	var p2 *Person = &p1
	// fmt.Println(*p2.Age) //這樣寫會報錯。因為.的優先級比*高
	fmt.Println(p2.Age) //語法糖

	//用type重定義(類似於取別名)但是他會認為是2種類型
	type Per Person
	// var p3 Person = Person{"tommy", 5}
	// var p4 Per
	// //p3=p4 //這樣會報錯
	// p4 = Per(p3) //這樣強轉
	// fmt.Println(p3, p4)
	fmt.Println("--------------")
	//struct的每個字段上可以寫一個tag,該tag可以通過反射機制獲取,常用於序列化
	pj := Per{"李四", 44}
	jsonStr, err := json.Marshal(pj) //返回的是byte
	if err != nil {
		fmt.Println("錯誤")
	}
	fmt.Println(string(jsonStr)) //返回的是byte所以加一個string

}

上次修改於 2021-08-01

此篇文章的評論功能已經停用。