基础语法与概念

import导入的三种形式

支持绝对路径和相对路径

  1. .操作,类似于js中的import 模块

    go 复制代码
    import (
       . "fmt"
    )
    //使用时可省略模块名前缀:
    Printf("key:%v value=%v;", k, v)
  2. 别名操作,类似于import b as c from "b"

    go 复制代码
    import (
       f "fmt"
    )
    
    f.Printf("key:%v value=%v;", k, v)
  3. _操作,调用包里面的init函数

    go 复制代码
    import (
        "database/sql"
        _ "github.com/ziutek/mymysql/godrv"
    )

结构体:struct

声明新的类型,作为其它类型的属性或字段的容器

  • 声明和初始化

    go 复制代码
    type person struct {
            name string
            age int
    }
    
    P.name = "Astaxie"  // 赋值"Astaxie"给P的name属性.
    P.age = 25  // 赋值"25"给变量P的age属性
    fmt.Printf("The person's name is %s", P.name)  // 访问P的name属性.
    
    // 也可以使用下面几种方式进行初始化
    // 1.按声明顺序初始化
    P:=person{"jack",26}
    // 2. 通过failed:value初始化
    P := person{age:24, name:"Tom"}
    // 3. 通过new声明一个指针
    P:= new(person)
  • 匿名字段,嵌入式字段,即:继承

    go 复制代码
    package main
    
      import (
              f "fmt"
      )
    
      type commonResponse struct {
              code string
              msg  string
      }
    
      type loginInfoData struct {
              token    string
              userId   string
              userName string
              phone    string
      }
    
      type loginInfo struct {
              commonResponse
              data loginInfoData
      }
    
      func main() {
              loginRes := loginInfo{
                      commonResponse{
                              code: "10000",
                              msg:  "success",
                      },
                      loginInfoData{
                              userId:   "123456",
                              token:    "tttttooooXXXXKKKKK",
                              userName: "皮皮虾",
                              phone:    "16543432076",
                      },
              }
              f.Println(loginRes.code)
              f.Println(loginRes.data)
      }

面向对象

method

类似js中的class,go中没有this,声明函数时可以定义接收者,这种函数称作method

go 复制代码
package main

import (
	f "fmt"
)

const (
	WHITE = iota
	BLACK
	BLUE
	RED
	YELLOW
)

type Color byte

type Box struct {
	width, height int
	color         Color
}

func (r Box) area() int {
	return r.height * r.width
}

func (r *Box) setColor(color Color) {
	r.color = color
	f.Printf("setColor:%v\n", r)
}

func main() {
	box1 := Box{
		10,
		20,
		YELLOW,
	}
	box1.setColor(WHITE)

	box2 := Box{
		6,
		7,
		BLACK,
	}

	f.Println(box1.area())
	f.Println(box2.area())
	f.Println(box1)

}

使用method的时候要注意几点:

  • 虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样
  • method里面可以访问接收者的字段
  • 调用method通过.访问,就像struct里面访问字段一样
  • method 不仅可以用在struct上,还可以定义在任何类型上

下面两个是不同的method

go 复制代码
func (r Rectangle) area() float64 {
	return r.width*r.height
}

func (c Circle) area() float64 {
	return c.radius * c.radius * math.Pi
}

指针作为接收者

默认情况下,传递给method的是接收者的一个copy,如果想要修改接收者,需要传递指针过去,例如上面例子中的setColor方法

method继承的继承

如果匿名字段实现了一个method,那么包含这个匿名字段的struct也能调用该method

相关推荐
Mgx5 小时前
深入理解 Windows 全局键盘钩子(Hook):拦截 Win 键的 Go 实现
go
王中阳Go5 小时前
又整理了一场真实Golang面试复盘!全是高频坑+加分话术,面试遇到直接抄
后端·面试·go
itarttop7 小时前
Go Error 全方位解析:原理、实践、扩展与封装
go
itarttop7 小时前
Go Channel 深度指南:规范、避坑与开源实践
go
不爱笑的良田18 小时前
从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
云原生·容器·kubernetes·go·压力测试·k6
Java陈序员1 天前
代码检测器!一款专门揭露屎山代码的质量分析工具!
docker·go
豆浆Whisky1 天前
Go编译器优化秘籍:性能提升的黄金参数详解|Go语言进阶(16)
后端·go
不爱笑的良田1 天前
从零开始的云原生之旅(九):云原生的核心优势:自动弹性伸缩实战
云原生·容器·kubernetes·go
无限中终3 天前
ENERGY Designer:重构跨平台GUI开发的高效解决方案
重构·go·结对编程
shining3 天前
[Golang] 万字详解,深入剖析context
go