- 主题:这2个有什么区别?
type Addifier interface{ Add(a, b int32) int32 }
type Adder struct{ name string }
//go:noinline
func (adder Adder) Add(a, b int32) int32 { return a + b }
var _ Addifier = (*Adder)(nil)
var _ Addifier = (Adder)(nil)
这两行代码有什么区别?
var _ Addifier = (*Adder)(nil)
var _ Addifier = (Adder)(nil)
--
FROM 222.128.87.*
var _ Addifier = (*Adder)(nil)
这就是正常代码
var _ Addifier = (Adder)(nil)
这行不能过吧?GoLand 提示 can not convert nil to the type 'Adder'
【 在 sumanwang (sumanwang) 的大作中提到: 】
: type Addifier interface{ Add(a, b int32) int32 }
: type Adder struct{ name string }
: //go:noinline
: ...................
--
FROM 111.206.87.*
Addifier 是一个类型, *Addifier才是指针。
我的理解是
var _ *Addifier = (*Adder)(nil)
var _ Addifier = (Adder)(nil)
这样才是对的。但是编译器说2种方式都是错的。
原因在哪里?
【 在 hothail (沸冰!无尽的华尔兹) 的大作中提到: 】
: 标 题: Re: 这2个有什么区别?
: 发信站: 水木社区 (Wed Jun 16 18:28:04 2021), 站内
:
: var _ Addifier = (*Adder)(nil)
: 这就是正常代码
:
: var _ Addifier = (Adder)(nil)
: 这行不能过吧?GoLand 提示 can not convert nil to the type 'Adder'
:
:
: 【 在 sumanwang (sumanwang) 的大作中提到: 】
: : type Addifier interface{ Add(a, b int32) int32 }
: : type Adder struct{ name string }
: : //go:noinline
: : ...................
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 111.206.87.*]
--
FROM 222.128.87.*
golang中,interface(可以当作)“天然”是指针
更新:就是一种简便理解,具体实质是什么目前没看到官方解释
有达人愿意讨论可以讨论
- 来自 水木社区APP v3.4.2
【 在 sumanwang 的大作中提到: 】
: Addifier 是一个类型, *Addifier才是指针。
: 我的理解是
: var _ *Addifier = (*Adder)(nil)
: var _ Addifier = (Adder)(nil)
: 这样才是对的。但是编译器说2种方式都是错的。
:
: 原因在哪里?
:
:
:
:
:
--
修改:hothail FROM 111.206.87.*
FROM 223.104.3.*
这个有出处吗?
【 在 hothail (沸冰!无尽的华尔兹) 的大作中提到: 】
: golang中,interface天然是指针
: - 来自 水木社区APP v3.4.2
--
FROM 222.128.87.*
哦,没文档,实践
或者这个地方 应该加上引号“指针”,只是表述一种使用方式 理解
不是c中的 pointer
【 在 sumanwang (sumanwang) 的大作中提到: 】
: 这个有出处吗?
--
FROM 111.197.114.*
这就压根不对。你给 int 起个别名定义几个方法一样能满足 interface,用起来和指针根本两回事。结构体和结构体指针都能实现接口。
【 在 hothail 的大作中提到: 】
: golang中,interface天然是指针
:
:
: ...................
--
FROM 114.249.195.*
你这里指针类型和结构体类型都可以实现 Addifier,写
var _ Addifier = Adder{}
就不会有语法问题。
你的写法出错问题和接口实现无关,单纯就是等号后面类型转换是错的。写
(Adder)nil 不成立。
【 在 sumanwang 的大作中提到: 】
: type Addifier interface{ Add(a, b int32) int32 }
:
: type Adder struct{ name string }
: ...................
--
FROM 114.249.195.*
Go 有个我认为比较怪的特性,就是一方面类型方法的 receiver(一般怎么翻译?)既可以是值类型也可以是指针类型,另一方面如果方法是通过值类型定义的,则既可以通过值类型也可以通过指针类型调用。
造成的结果就是你这里定义的类型,不仅 Adder 实现了 Addifier,*Adder 也实现了 Addifier。
这是有意的设计,不过可能多少容易引起概念上的混淆。
又及,把 interface 看成指针是更大的易混淆概念了。go 是值语义的,包括 interface 变量也是值语义的。给 interface 类型的变量 i1 传一个结构体值 s,再赋值给另一个 interface 变量 i2,那么 i1 和 i2 里面打包保存的两个值 s 就是独立的两个副本,互不干扰的(值语义),而不是指向同一对象的指针一个所指对象变化另一边看到该对象跟着变。
interface 就是显式带虚表的对象类型,内部实现对象值是通过指针分配内存但不影响语义是纯值语义的。
【 在 sumanwang 的大作中提到: 】
: type Addifier interface{ Add(a, b int32) int32 }
:
: type Adder struct{ name string }
: ...................
--
FROM 114.249.195.*
传值/传引用自适应这个
确实属于虽然很方便但是感觉很不自在的语法糖
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: Go 有个我认为比较怪的特性,就是一方面类型方法的 receiver(一般怎么翻译?)既可以是值类型也可以是指针类型,另一方面如果方法是通过值类型定义的,则既可以通过值类型也可以通过指针类型调用。
: 造成的结果就是你这里定义的类型,不仅 Adder 实现了 Addifier,*Adder 也实现了 Addifier。
: 这是有意的设计,不过可能多少容易引起概念上的混淆。
: ...................
--
FROM 116.233.186.*