基础语法与概念

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

相关推荐
研究司马懿11 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Minilinux20183 天前
Google ProtoBuf 简介
开发语言·google·protobuf·protobuf介绍
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go