当前位置: 首页 > 面试题库 >

指针上的golang指针作为函数参数

夏侯元忠
2023-03-14
问题内容

我有以下功能:

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()
}

题:

这是真的mtreatsdog通过按引用 ,并且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执行GritsWhatever不执行,因为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工具RenableCandy没有。

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语言规则: 可以从具有值接收器的方法派生具有指针接收器的方