• golang学习笔记----struct 方法


    结构方法:

    方法根据传入的参数的不同,又分为:值传递 和 指针传递。两者的效果就是:值传递不可改变值,指针传递可以改变值。

    • 值传递的适用于取值
    • 指针传递适用于更改字段的值
    type Response struct {
        Code    int
        Result  []byte
        Headers map[string]string
    }
    
    func (r Response) GetAttrCode() int {
        return r.Code
    }
    func (r Response) GetAttrResult() []byte {
        return r.Result
    }
    
    func (r Response) GetAttrHeader() map[string]string {
        return r.Headers
    }
    
    func (r *Response) SetCode(code int) {
        r.Code = code
    }
    
    func (r *Response) SetHeaders(key, value string) {
        r.Headers[key] = value
    }
    
    func exampleResponse() {
        var (
            response Response
            headers  map[string]string
        )
        headers = make(map[string]string)
        headers["Server"] = "GitHub.com"
        headers["Status"] = "Ok"
        response.Headers = headers
        response.Code = 200
        response.Result = []byte("hello world")
    
        fmt.Println(response.GetAttrCode())
        fmt.Println(response.GetAttrHeader())
        fmt.Println(response.GetAttrResult())
    
        response.SetCode(404)
        fmt.Println(response)
    
        response.SetHeaders("Status", "failed")
        fmt.Println(response)
    }
    
    
    func main() {
        exampleResponse()
    }
    
    
    >>>
    
    200
    map[Server:GitHub.com Status:Ok]
    [104 101 108 108 111 32 119 111 114 108 100]
    {404 [104 101 108 108 111 32 119 111 114 108 100] map[Server:GitHub.com Status:Ok]}
    {404 [104 101 108 108 111 32 119 111 114 108 100] map[Status:failed Server:GitHub.com]}
    

      

     函数和方法的区别

    func NormalFunc(arg int) int {
        return arg + 1
    }
    
    
    func (r *Response) SetCode(code int) {
        r.Code = code
    }

    Go 方法是作用在接收者(receiver)上的一个函数。接收者可以是几乎任何类型。

    但一般选择 结构体 作为接收者。

    组合:

    匿名字段

    在 Golang 中可以通过结构体的组合实现类的继承。

    即:将一个结构体A当成另一个结构体B的匿名字段,则 这个结构体B自动拥有A的所有字段和方法。

    type Response struct {
        Code    int
        Result  []byte
        Headers map[string]string
    }
    
    func (r Response) GetAttrCode() int {
        return r.Code
    }
    func (r Response) GetAttrResult() []byte {
        return r.Result
    }
    
    func (r Response) GetAttrHeader() map[string]string {
        return r.Headers
    }
    
    func (r *Response) SetCode(code int) {
        r.Code = code
    }
    
    func (r *Response) SetHeaders(key, value string) {
        r.Headers[key] = value
    }
    
    type Requests struct {
        Url    string
        Params string
    }
    
    type CollectionRequests struct {
        CollectionNumber int
        Requests
        Response
    }
    
    func exampleCollectionRequests() {
    
        var collectionRequests CollectionRequests
        collectionRequests.CollectionNumber = 10
        collectionRequests.Url = "https://www.example.com"
        collectionRequests.Params = "name"
        collectionRequests.Code = 201
        collectionRequests.Result = []byte("hello Golang")
    
        var headers map[string]string
        headers = make(map[string]string)
        headers["status"] = "Good"
        collectionRequests.Headers = headers
        fmt.Println(collectionRequests)
        
        fmt.Println(collectionRequests.GetAttrCode())
    }
    
    func main() {
        exampleCollectionRequests()
    }
    
    >>>
    
    {10 {https://www.example.com name} {201 [104 101 108 108 111 32 71 111 108 97 110 103] map[status:Good]}}
    201
    

    上文CollectionRequests 拥有两个匿名字段Requests、Response ,则自动拥有这个两个结构体的字段和方法。

    内嵌结构体

    这个组合的形式会遇到两个问题:

    • 字段相同怎么办?即结构体A 有字段 a, 结构体 B 也有字段 a。怎么处理?
    • 方法相同怎么办?即结构体A 有方法 methodOne, 结构体 B 也有方法 methodOne。怎么处理?

    应该尽量避免命名冲突。同时可以使用多个点号的方法访问字段。方法则优先使用结构体B 的。


    type OtherRequests struct {
        Request Requests
        Resp    Response
        Code    int
    }
    func (o OtherRequests) GetAttrCode() {
        fmt.Println(fmt.Sprintf("Outer Code = %d", o.Code))
        fmt.Println(fmt.Sprintf("inner Code = %d", o.Resp.Code))
    }
    func exampleOtherRequests() {
        var other OtherRequests
        other.Code = 201
        other.Resp.Code = 202
        fmt.Println(other)
        other.GetAttrCode()
        fmt.Println(other.Resp.GetAttrCode())
    }
    func main() {
        exampleOtherRequests()
    }
    
    
    >>>
    {{ } {202 [] map[]} 201}
    Outer Code = 201
    inner Code = 202
    202
    

      

    格式化显示结构体

    type OtherRequests struct {
        Request Requests
        Resp    Response
        Code    int
    }
    
    func (o OtherRequests) String() string {
        return fmt.Sprintf("Request = %v , Response = %v , Code = %d", o.Request, o.Resp, o.Code)
    }
    
    func exampleOtherRequests() {
        var other OtherRequests
        other.Code = 201
        other.Resp.Code = 202
        fmt.Println(other)
        other.GetAttrCode()
        fmt.Println(other.Resp.GetAttrCode())
    }
    
    func main() {
    
        exampleOtherRequests()
    }
    
    >>>
    Request = { } , Response = {202 [] map[]} , Code = 201
    Outer Code = 201
    inner Code = 202
    202
    

      

    完整示例

    package main
    
    import "fmt"
    
    type Response struct {
    	Code    int
    	Result  []byte
    	Headers map[string]string
    }
    type Requests struct {
    	Url    string
    	Params string
    }
    
    type OtherRequests struct {
    	Request Requests
    	Resp    Response
    	Code    int
    }
    
    func (o OtherRequests) GetAttrCode() {
    	fmt.Println(fmt.Sprintf("Outer Code = %d", o.Code))
    	fmt.Println(fmt.Sprintf("inner Code = %d", o.Resp.Code))
    }
    
    func (r Response) GetAttrCode() int {
    	return r.Code
    }
    func (r Response) GetAttrResult() []byte {
    	return r.Result
    }
    
    func (r Response) GetAttrHeader() map[string]string {
    	return r.Headers
    }
    
    func (r *Response) SetCode(code int) {
    	r.Code = code
    }
    
    func (r *Response) SetHeaders(key, value string) {
    	r.Headers[key] = value
    }
    
    func (o OtherRequests) String() string {
    	return fmt.Sprintf("Request = %v , Response = %v , Code = %d", o.Request, o.Resp, o.Code)
    }
    
    func exampleOtherRequests() {
    	var other OtherRequests
    	other.Code = 201
    	other.Resp.Code = 202
    	headers := make(map[string]string)
    	headers["status"] = "Good"
    	other.Resp.Headers = headers
    	other.Resp.Result = []byte("hello Golang")
    	other.Request.Url = "https://www.example.com"
    	other.Request.Params = "name"
    	fmt.Println(other)
    	other.GetAttrCode()
    	fmt.Println(other.Resp.GetAttrCode())
    }
    
    func main() {
    
    	exampleOtherRequests()
    }
    

      输出:

    Request = {https://www.example.com name} , Response = {202 [104 101 108 108 111 32 71 111 108 97 110 103] map[status:Good]} , Code = 201
    Outer Code = 201
    inner Code = 202
    202
    

      

  • 相关阅读:
    java代码中存在的Big Endian 和 Little Endian
    通过hbase实现日志的转存(MR AnalyserLogDataRunner和AnalyserLogDataMapper)
    hbase使用MapReduce操作1(基本增删改查)
    配置好Nginx后,通过flume收集日志到hdfs(记得生成本地log时,不要生成一个文件,)
    数据库分页查询
    将博客搬至CSDN
    Dev Winform本地化
    C#,OleDbType,Access 对应数据类型
    C#字符串转义和反转义
    C# 正则表达式
  • 原文地址:https://www.cnblogs.com/saryli/p/13253329.html
Copyright © 2020-2023  润新知