天天看點

go語言筆記(結構體、方法、接口)go語言筆記(結構體、方法、接口)

go語言筆記(結構體、方法、接口)

1、結構體

  • 結構體的定義,結構體中字段的類型可以是任何類型
type identifier struct {
  field1 type1
  field2 type2
  ...
}
           
  • 結構體内可以有匿名字段,每一中資料類型隻能有一個匿名字段
type identifier struct{
	name string
	int
}
           
  • 建立結構體
func main(){
	a:=new(student)//方式1:通過new建立
    b:=student{"jane",33}//方式2
    c:=&student{    //方式3
	name:"ken",
	age:34,
	}
	fmt.Println(a,b,c)
}
/*運作結果
&{ 0} {jane 33} &{ken 34}
*/
           
  • 操作結構體
a.name="kk"
a.age=l
           
  • 如果定義結構體的字段時首字母為小寫在其他包是不能直接通路該字段的,這時候需要用到匿名變量
a.Name="kk"
a.int=11
           
  • 結構體還可以定義标簽,一般用于orm和json的資料傳遞
type student struct{
	Name string `json:"name"`
	Age int `json:"age"`
}
func ToJson(s student)(string,error)  {
	fmt.Println(s)
	bytes,err:=json.Marshal(s)
	if err != nil{
		return "",nil
	}
	//fmt.Println("i")
	return string(bytes),nil
}
func main(){
    b:=student{"jane",33}
 fmt.Println(ToJson(b))
}
/*運作結果
{"name":"jane","age":33} <nil>
*/
           
  • 内嵌結構體
type A struct {
	X, Y int
}
type B struct {
	A            //A是匿名字段,B可以使用結構體A中的變量
	Name string
}
           

2、方法

  • 方法定義,r為方法的接收者
func (r Receiver)func_name(){
  // body
}
           
  • 方法接收者分為值接收者和指針接收者,對指針接收者會影響原來類型變量,值接收者是不會影響原來的類型變量
func (s student) GetName()string{ //值傳遞
        return s.name
}
func (s *student) GetName()string{//指針傳遞
        return s.name
}
           
  • == 使用值接收者定義的方法使用指針來調用也是可以的,反過來也是如此==

3、接口

  • 接口的定義,接口要用interface定義
type Namer interface {
    Method1(param_list) return_type
    Method2(param_list) return_type
    ...
}
           
  • 實作了一個接口裡的每個方法就相當于實作了這個接口,允許多個類型都實作同個接口,一個類型也可以實作多個接口
type stu interface{    //接口
	learn()
}
func (b student) learn()  {//接口中調用了此方法
	fmt.Println(b.Name+"學英語")
}
func learnwhat(a student)  {//函數調用了learn方法,也相當于調用了接口
	a.learn()
}

func main(){
	b:=student{"jane"}
	learnwhat(b)
}
/*運作結果
jane學英語
*/
           
  • 類型斷言,若方法傳遞來的是一個接口類型,就要判斷是哪個具體的類型,才能進行下一步操作
func WhatType(a Animal) {
	switch a.(type) {
	case Dog:
		fmt.Println("Dog")
	case Bird:
		fmt.Println("Bird")
	default:
		fmt.Println("error")
	}
}
           
  • 空接口,就是接口裡面沒有任何方法,可以表示任意一個類型
var any interface{}

any = 1
fmt.Println(any)

any = "hello"
fmt.Println(any)

any = false
fmt.Println(any)
/*運作結果
1
hello
false