Let's GO(三)

人生苦短,Let's GO

今天我學了什麼?

1. 結構體(struct)

/*
type TYPENAME struct {
name type
...
}
*/html

type person struct { 
	name, city string  //這裏上下類型的位置最好對上,可使用go fmt完成代碼格式化
	age               int8
}
//1.定義
var p1 person
p1.name = ""
...
//2.定義並賦值
p2 := person{
	name: " "   //name:能夠略去,此時必須初始化全部字段且與定義順序一致
	city: ""
	age:20
}
//3.
var p3 = new(person) //p3:=&person{}
(*p3).name = ""
p3.city="" //能夠直接調用指針結構體中的字段

匿名類python

var user struct {
		name string
		age  int
}
user.name = "Joko"
user.age = 80
fmt.Printf("p1:%#v\n", user)

二、方法(Method)和 接收者

方法就是類內函數,也不知道go是怎麼神奇的將零散的方法整合成一個大結構
接收者是一個我沒據說過的概念,學習以後感受做用相似與this指針函數

//構造函數,習慣上命名爲NewStructName
func NewPerson(name string,age int) *Person  { 
	return &Person{
		name:name,
		age:age,
	}
}
//(p Person)就是接收者啦,慣例取類第一個字母小寫爲名,這裏是值接收者
func (p Person) Dream()  {
	fmt.Printf("%s is dreaming\n",p.name)
}

//指針接收者在修改內部數據上更有優點(本身聲明的this)
func (p *Person) SetAge(age int) {
	p.age = age
}

3. 組合與繼承

Go的官方迴應Go是否爲面對對象語言時表示yes and no,
yes :Go 具有不少面對對象的特性
no:但Go又不像C++或Java那麼強硬的封裝學習

type Address struct {
	city string
}

type Person2 struct {
	name string
	age int
	Address //Address類以匿名類形式進行組合
}

p2 := Person2{
		name:    "JOKO",
		age:     10,
		Address: Address{"hk"},
	}
fmt.Printf("%#v\n",p2)
fmt.Println(p2.city)  //直接訪問匿名結構體字段,前提是不存在字段衝突
//若是不使用匿名類調用方式:p2.Address.city
type Animal struct {
	name string
}

func (a *Animal) move() {
	fmt.Printf("%s move",a.name)
}

type Dog struct {
	feet int
	*Animal
}

func (d *Dog) wang()  {
	fmt.Printf("%s www",d.name)
}

d.wang()
d.move()

繼承與多態,可是沒有任何明確的說繼承這個字眼this

4.接口(interface)

接口其餘都無論,就認方法,實現方法就是實現了接口。指針

type sayer interface {
	say()
}
func (p Person) say() {
	fmt.Println("Hi")
}
//實現接口
func sayHi(arg sayer)  {
	arg.say()
}
type Sayer interface {
	say()
}

//實現多個接口
type Runer interface {
	run()
}

//接口嵌套
type animal interface {
	Sayer
	Runer
}

空接口 interface{}
神奇的一個東西:任何類型都實現空接口,因此空接口能夠存儲任意類型值
這是Go的泛型?code

type xxx interface {
}
var x interface{}  //直接聲明空接口變量x
x = "Hello"        //x 能夠實現任意變量
fmt.Println(x)
x = 123
fmt.Println(x)
x = false
fmt.Println(x)

var m = make(map[string]interface{},16)
m["name"] = "Pallava"
m["age"] = 18
m["hobby"] = []string{"sing","jump","rap"}
fmt.Println(m)
//斷言:判斷空接口存的值的類型
ret,ok:= x.(bool)
if !ok {
	fmt.Println("not bool")
} else {
	fmt.Println("is bool",ret)
}

總結:

很明顯,Go的語言出乎意料的精煉高效,像開發python同樣愉快的開發C++般功能的項目。
但願Go愈來愈強大(後浪!)
那麼朋友,人生苦短,Let's GO!htm

相關文章
相關標籤/搜索