以下是我不太了解的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 *之间的区别相同。
但在这种情况下我应该使用 - >代替 。 (点)?
答案 0 :(得分:2)
&
运算符为您提供指向结构的指针,而不使用它会为您提供结构值。
这个相关的最大的地方是当你将这个结构传递给另一个函数时 - 如果你传递了你使用&
运算符创建的指针,那么另一个函数可以访问相同的 struct。如果该功能改变了它,你也可以获得改变的结构。
如果传递的是您在没有&
运算符的情况下生成的变量,则传递给它的函数将具有结构的副本。没有任何功能或任何其他功能可以改变您在变量中看到的内容。
这有效地使值变量在没有竞争条件的多个go例程中使用是安全的 - 每个人都有自己的结构副本。
如果将使用&
创建的指针传递给其他go例程,则所有指针都可以访问相同的结构,因此您真的希望这是有意的并且需要考虑。
答案 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 {}
如果省略MyClass
或*
变量,则类型变得不兼容,分配失败。
隐式指针间接。 Go在&
之类的语句中自动执行,以通过指向它的方式访问struct中的特定字段。
只有在极少数情况下,如果存在歧义,您必须使用完整形式:
* ptr1.Value1
甚至有时甚至:
(* ptr1).Value1
<强>更新强>:
消除歧义的显式指针用法:
ptr1.Field1
答案 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
}