无法访问指针接收器中的值

时间:2019-03-29 06:25:52

标签: pointers go struct interface scheduler

我无法从Pointer接收器获取价值。它不断返回内存地址。
我正在尝试以以下格式访问来自其他文件的指针接收器的值

package types

import (
    // "Some product related imports"
    "golang.org/x/oauth2"
    "time"
)

type TestContext struct {
    userId string
}

func (cont *TestContext) GetUserId() string {
    return cont.userId
}

在其他文件中,我像这样使用它

package abc

import (
    myType "xyz_path/types"
)

func getAllUsersConn() map[string]interface{} {

    // Technique 1
    // Below commands working fine and returning memory address
    ctx1 := myType.TestContext{}
    logging.Debug("Here 3 = ", ctx1.GetUserId())

    // above working fine but with address

    // Technique 2

    // Below return will nill values
    ctx := myType.TestContext{}
    var101 := (ctx.GetUserId())
    logging.Debug(ctx, var101)

    // Technique 3

    // Below returns with error : invalid indirect of types.TestContext literal (type types.TestContext)
    ctx2 := *myType.TestContext{} // Error : invalid indirect of types.TestContext literal (type types.TestContext)
    // and if
    ctx2 := *myType.TestContext // ERROR : type *types.TestContext is not an expression
    logging.Debug("exp id = ", ctx2.GetUserId)

    UsersConn := make(map[string]interface{})
    // passing some hardcoded values for test, but need to get the user id from above then pass
    return UsersConn
}

我正在尝试通过多种方式来解决它,但要么获取内存地址,nil值要么出错。

2 个答案:

答案 0 :(得分:1)

始终编写干净的代码:

  1. 名称let nameStartingWithBArray = name.filter {$0.first != "B"}.map {$0.uppercased()}.sorted() 而非userID
  2. 名称userId而非UserID()
  3. 使用GetUserId()代替ctx2 := &myType.myType{}

  4. 尝试this代码:

ctx2 := *myType.myType{}

输出:

package main

import (
    "fmt"
)

type myType struct {
    userID string
}

func (cont *myType) UserID() string {
    return cont.userID
}

func main() {
    ctx1 := myType{"1"}
    fmt.Println(ctx1.UserID()) // 1

    ctx := myType{"2"}
    var101 := ctx.UserID()
    fmt.Println(ctx1.UserID(), var101) // 1 2

    ctx2 := &myType{}
    fmt.Println(ctx2) // &{}

    var ctx3 *myType
    fmt.Println(ctx3) // <nil>
}

答案 1 :(得分:-1)

对于技术1。我不确定logging.Debug()会做什么,但是我认为您正在尝试将字符串传递给它。在这种情况下,请使用ctx2.GetUserId()而不是ctx2.GetUserId。我知道这听起来很愚蠢,但是要调用不带参数的函数,您仍然需要括号。

主要问题是您使用的是myType包,但您认为您使用的是type包。否则我认为技术2可以。

就像沃尔克暗示的那样,您需要使用&而不是*来获取对象的地址。