我有以下功能:
func addCatsToMap(m map[string][]CatHouse, meowId int, treats Set, dog *Dog) {
//if (complicated thing) add Cat to m
}
其中Set
,的类型treats
是具有以下定义的接口:
type Set interface {
Add(value string)
Contains(value string) (bool)
Length() (int)
RemoveDuplicates()
}
题:
这是真的m
,treats
和dog
是 通过按引用 ,并且meowId
有它的价值被复制?
我认为:
m
是通过引用的,因为它是一张地图dog
是一个结构。因此,我应该传递指针以避免复制数据接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴
我的意思是,如果您具有以下条件:
type Whatever struct {
Name string
}
然后定义以下两种方法:
func (w *Whatever) Foo() {
...
}
func (w Whatever) Bar() {
...
}
然后类型Whatever
只有方法Bar()
,而类型*Whatever
只有方法Foo()
和Bar()
。这意味着如果您具有以下界面:
type Grits interface {
Foo()
Bar()
}
然后*Whatever
执行Grits
但Whatever
不执行,因为Whatever
缺少方法Foo()
。当您将函数的输入定义为接口类型时,您不知道它是指针还是值类型。
下面的示例说明了同时采用两种接口类型的函数:
package main
import "fmt"
type Fruit struct {
Name string
}
func (f Fruit) Rename(name string) {
f.Name = name
}
type Candy struct {
Name string
}
func (c *Candy) Rename(name string) {
c.Name = name
}
type Renamable interface {
Rename(string)
}
func Rename(v Renamable, name string) {
v.Rename(name)
// at this point, we don't know if v is a pointer type or not.
}
func main() {
c := Candy{Name: "Snickers"}
f := Fruit{Name: "Apple"}
fmt.Println(f)
fmt.Println(c)
Rename(f, "Zemo Fruit")
Rename(&c, "Zemo Bar")
fmt.Println(f)
fmt.Println(c)
}
你可以调用Raname(&f, "Jorelli Fruit")
,但不能Rename(c, "Jorelli Bar")
,因为这两个Fruit
和*Fruit
实施Renamable
,而*Candy
工具Renable
和Candy
没有。
http://play.golang.org/p/Fb-L8Bvuwj
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType
主要内容:用数组作函数参数在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的 指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数
本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32
Go 指针 Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。 以下实例演示了如何向函数传递指针,并在函数调用后修改函数内的值,: package main import "fmt" func main() { /* 定义局部变量 */ var a int = 100 var b int= 200 fmt.Printf("交换前 a 的值 :
在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a
问题内容: 我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C ++现在很遥远…)。例如,在“第52号游览”中(http://tour.golang.org/#52),我读到: 但是如果不是 我写: 甚至: 反之亦然: 我得到了完全相同的结果。有区别吗(在内存方面,等等)? 问题答案: 您的示例使用两种Go语言规则: 可以从具有值接收器的方法派生具有指针接收器的方