对于go中的变量定义用的短横线的写法

zackzhangkai · · 1199 次点击
上面关于顺序的问题:由于go并不是个脚本语言,与顺序没有太大关系,与编译有关,关于编译参考 https://www.cnblogs.com/qcrao-2018/p/11124360.html 。
#4
更多评论
没有人回答,我在这这里贴下我在微信群里询问到的答案: 1. 首先贴上[github地址](https://github.com/kubernetes-sigs/controller-runtime/blob/a4b50a42e0bc88020e90ba5d948a8941e9cf9aff/examples/builtins/controller.go) 2. 完整代码如下: ```go // reconcileReplicaSet reconciles ReplicaSets type reconcileReplicaSet struct { // client can be used to retrieve objects from the APIServer. client client.Client log logr.Logger } // Implement reconcile.Reconciler so the controller can reconcile objects var _ reconcile.Reconciler = &reconcileReplicaSet{} func (r *reconcileReplicaSet) Reconcile(request reconcile.Request) (reconcile.Result, error) { // set up a convenient log object so we don't have to type request over and over again log := r.log.WithValues("request", request) // Fetch the ReplicaSet from the cache rs := &appsv1.ReplicaSet{} err := r.client.Get(context.TODO(), request.NamespacedName, rs) if errors.IsNotFound(err) { log.Error(nil, "Could not find ReplicaSet") return reconcile.Result{}, nil } if err != nil { return reconcile.Result{}, fmt.Errorf("could not fetch ReplicaSet: %+v", err) } // Print the ReplicaSet log.Info("Reconciling ReplicaSet", "container name", rs.Spec.Template.Spec.Containers[0].Name) // Set the label if it is missing if rs.Labels == nil { rs.Labels = map[string]string{} } if rs.Labels["hello"] == "world" { return reconcile.Result{}, nil } // Update the ReplicaSet rs.Labels["hello"] = "world" err = r.client.Update(context.TODO(), rs) if err != nil { return reconcile.Result{}, fmt.Errorf("could not write ReplicaSet: %+v", err) } return reconcile.Result{}, nil } ``` 3. 这里其实是类型断言 **要求reconcileReplicaSet结构体实现reconcile.Reconciler这个接口,否则编译时就会报错** # 代码分析 1. 看上面的代码,首先是定义了一个结构体reconcileReplicaSet 2. 紧接着,就断言这个接构体实现了reconcile.Reconciler接口 3. 然后是这个结构体的真正实现接口的方法。 ***从这个顺序上可以看到,代码只在第一步定义了结构体,但是在第三步才实现接口,但是类型判断是在第二步,如果按顺序肯定会报错,那既然是这样写,肯定是没有错的。原因在哪呢?***
#1
首先 go里要求所有的变量在定义后都需要被使用(包级变量除外)。 所以经常需要用 _ 来存放不使用的变量。 其次,合理加这个代码是为了保证 &reconcileReplicaSet{} 实现了 reconcile.Reconciler 接口。 我不喜欢把这种的代码放在主逻辑里,一般放在测试代码里验证。
#2