通过引用实例化对象

时间:2017-11-23 16:26:01

标签: go

以下是我不太了解的Go代码示例:

Processing DSL script jobs.groovy
Warning: (jobs.groovy, line 30) acceptMergeRequestOnSuccess is deprecated
Warning: (jobs.groovy, line 34) addNoteOnMergeRequest is deprecated
Warning: (jobs.groovy, line 35) addVoteOnMergeRequest is deprecated
Warning: (jobs.groovy, line 36) acceptMergeRequestOnSuccess is deprecated
ERROR: (jobs.groovy, line 50) No such property: ARTIFACTORY_USER for class: javaposse.jobdsl.dsl.helpers.toplevel.EnvironmentVariableContext
Finished: FAILURE

我可以使用相同的语法对type MyClass struct { field1 string field2 string } ... objectinstance1 := MyClass{field1:"Hello", field2:"World"} objectinstance2 := &MyClass{field1:"Hello", field2:"World"} objectinstance1(例如方法调用)执行完全相同的操作。

所以我不明白&的作用。运营商。我的理解是objectinstance2包含一个对象,而objectinstance1包含一个指针。

对我而言,C中的相同之处与char和char *之间的区别相同。

但在这种情况下我应该使用 - >代替 。 (点)?

4 个答案:

答案 0 :(得分:2)

&运算符为您提供指向结构的指针,而不使用它会为您提供结构值。

这个相关的最大的地方是当你将这个结构传递给另一个函数时 - 如果你传递了你使用&运算符创建的指针,那么另一个函数可以访问相同的 struct。如果该功能改变了它,你也可以获得改变的结构。

如果传递的是您在没有&运算符的情况下生成的变量,则传递给它的函数将具有结构的副本。没有任何功能或任何其他功能可以改变您在变量中看到的内容。

这有效地使值变量在没有竞争条件的多个go例程中使用是安全的 - 每个人都有自己的结构副本。

如果将使用&创建的指针传递给其他go例程,则所有指针都可以访问相同的结构,因此您真的希望这是有意的并且需要考虑。

答案 1 :(得分:1)

差异是不可见的,因为它隐藏在两件事中:

  1. 运算符using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Azure.WebJobs.Host; using System; namespace AzureFunctionTests { public static class WhereAmIRunning { [FunctionName("whereamirunning")] public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log) { bool isLocal = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID")); string response = isLocal ? "Function is running on local environment." : "Function is running on Azure."; return req.CreateResponse(HttpStatusCode.OK, response); } } } ,它同时为变量赋值和类型。因此看起来:=objectinstance1是相同的。但事实上,第一个是objectinstance2实例,第二个是指向它的指针。如果使用长格式运算符,它将更明显:

    var objectinstace1 MyClass = MyClass {} var objectinstance2 * MyClass =&amp; MyClass {}

  2. 如果省略MyClass*变量,则类型变得不兼容,分配失败。

    1. 隐式指针间接。 Go在&之类的语句中自动执行,以通过指向它的方式访问struct中的特定字段。

      只有在极少数情况下,如果存在歧义,您必须使用完整形式:

      * ptr1.Value1

      甚至有时甚至:

      (* ptr1).Value1

    2. <强>更新

      消除歧义的显式指针用法:

      ptr1.Field1

      https://play.golang.org/p/JcXd_oNIAw

答案 2 :(得分:0)

But in this case i should use -> instead of . (dot) ?

没有。 Golang不是C不是Golang。在Golang,没有 ->。您也可以使用点(.)作为指针。 Golang意味着简单,如果意图明确,那么引入另一个运算符是没有意义的(指针上的.还有什么意思比调用方法?)

答案 3 :(得分:0)

在go中,& operator获取其参数的地址并返回pointer到参数的类型。

指针间接自动发生,因此没有->运算符,点运算符处理所有类型的所有字段(成员)操作和访问,无论是指针还是结构。

package main

import (
  "fmt"
  "reflect"
)

func main() {
  type Foo struct{ name string }
  foo1 := Foo{"Alpha"} // A plain struct instance.
  foo2 := &Foo{"Bravo"} // A pointer to a struct instance.
  fmt.Printf("foo1=%v, name=%v\n", reflect.TypeOf(foo1), foo1.name)
  fmt.Printf("foo2=%v, name=%v\n", reflect.TypeOf(foo2), foo2.name)
  // foo1=main.Foo, name=Alpha
  // foo2=*main.Foo, name=Bravo
}