go语言(7)

  • 面向对象
    1.go语言没有类,其结构体相当于类的作用;
    go语言(7)_第1张图片
    Name,Age属于字段/属性。
    2.字段一般是基本数据类型、数组,也可以是引用类型;
    3.在创建一个结构体变量后,如果没有赋值,都对应一个零值(默认值);
    指针、slice、map的零值都是nil,即还没有分配空间;
    使用map和slice一定要分配空间;
    4.不同结构体变量的字段是独立,互不影响的,一个结构体变量字段的更改,不影响另外一个,结构体是值类型;
    5.创建结构体变量和访问结构体字段
    (1)方式1:直接声明
var person Person

(2){}

var person Person=Person{"mary",20}

(3)&

var person *Person=new (Person)

(4){}

var person *Person=&Person{}

第三种方式和第四种方式返回的是结构体指针,结构体指针访问字段的标准方式为(*结构体指针).字段名,比如(*Person).name=“tom”;但go做了一个简化,也支持 结构体指针.字段名Person.name=“tom”
6.结构体的所有字段在内存中是连续的;但是他们指向的地址不一定连续。
7.1)结构体进行type重新定义,相当于取别名,go语言认为是新的数据类型,但是相互间可以强制类型转换。
go语言(7)_第2张图片
8.struct的每个字段上,可以写上一个tag,该tag可以通过一个反射机制获取,常见的使用场景为序列化和反序列化。

package main
import (
	"fmt"
	"encoding/json"
)
func main(){
	type cat struct{
		Name string
		Age int
	}

	var c cat=cat{"yuan",2}
	jsonstr,_:=json.Marshal(c)	
	fmt.Println(string(jsonstr))
}

{“Name”:“yuan”,“Age”:2}

package main
import (
	"fmt"
	"encoding/json"
)
func main(){
	type cat struct{
		Name string `json:"name"`
		Age int `json:"age"`
	}

	var c cat=cat{"yuan",2}
	jsonstr,_:=json.Marshal(c)	
	fmt.Println(string(jsonstr))
}

{“name”:“yuan”,“age”:2}
9.go在创建结构体实例(变量)时,可以直接指定字段的值。
(1)方式1
go语言(7)_第3张图片
(2)方式2
go语言(7)_第4张图片

  • 方法
    1.go中的方法是作用在指定的数据类型上的,因此自定义数据类型都可以有方法。
    2.go方法的声明
    在这里插入图片描述
    return返回值不是必须的。

go语言(7)_第5张图片
(1)test()方法和Person类型绑定;
(2)test()方法只能通过Person()类型的变量来调用,不能直接调用,也不能通过其他类型来调用;
(3)方法调用的传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当作实参也传递给方法;如果调用方法的变量是值类型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝。
4.如果一个类型实现了String()方法,那么fmt.Println默认会调用这个变量的String()进行输出。

package main
import (
	"fmt"
)
type Cat struct{
	Name string 
	Age int 
}
//定义String()字符串
//Sprintf的作用是将一个格式化的字符串输出到一个目的字符串中
func(c *Cat) String() string{
	str:=fmt.Sprintf("name=[%v] age=[%v]",c.Name,c.Age)
	return str
}
func main(){
	var c Cat=Cat{"yuan",2}	
	fmt.Println(&c)
}

name=[yuan] age=[2]
5.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。
6.对于方法(如struct方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反之亦然。不管调用形式如何,真正决定是值拷贝还是地址拷贝的,看这个方法是和哪个类型绑定。

  • 工厂模式
    使用工厂模式实现跨包创建结构体实例(变量)
package model

type Cat struct{
	Name string 
	Age int 
}

func NewCat(n string,a int) *Cat{
	return &Cat{
		Name :n,
	     Age :a, 
	}
}
package main
import (
	"fmt"
	"go_code/project01/model"
)

func main(){
	var c=model.NewCat("yuan",2)
	fmt.Println(c.Name)
}

结果:yuan
注:如果model包的结构体变量首字母变小写,引入后,不能直接使用,可以使用工厂模式来解决。(定义一个函数)

你可能感兴趣的:(go语言(7))