• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Asc.416e74
博客园    首页    新随笔    联系   管理     

关于golang方法的一些小点

本文在说什么

  1. 关于方法中的两个语法糖
  2. 一个设计规范

语法糖

在定义方法的时候,接收者可以是指针(*T),也可以是普通变量(T).而在调用的时候却可以不用在乎.

type Info struct {
	name string
	age uint
}

func (i *Info)ChangeName(s string) {
	i.name = s
}

func (i Info)say() {
	fmt.Printf("%s yestoday %d yea's old", i.name, i.age)
}

func main() {
	var i1 Info = Info{
		name: "zhangsan",
		age: 18,
	}
	i1.ChangeName("wangwu")
	fmt.Println(i1)
	var i2 *Info = &Info{
		name: "liis",
		age: 21,
	}
	i2.say()
}

i1.ChangeName("wangwu")使用非指针调用,不仅成功,如果运行程序你就会i1.name确实发生了变化.那是因为这句等价于&i1.ChangeName("wangwu")

而i2.say()也调用成功了,运行会发现也输出正确,这是因为其等价于(*i2).say()

而这两个在本质上都是因为编译器优化后的语法糖的原因.

一人指针,全家指针

由于方法的接收者既可以是变量,也可以是指针,因此,容易出现混肴.所以在设计的时候有一个不成文的规定: 如果有一个方法的接收者是指针,那么其所有方法都需要是指针

嵌套匿名结构体

如果一个结构体(A)匿名嵌套了另一个结构体(B),那么A可以通过与匿名字段相同的方式调用B的方法,但是依旧要小心不要与A自己的方法冲突.

posted @ 2021-06-15 04:07  ストッキング  阅读(45)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3