Невозможно получить доступ к значениям из приемника Pointer - PullRequest
0 голосов
/ 29 марта 2019

Я не могу получить значение из приемника указателя.Он возвращает адрес памяти.
Я пытаюсь получить доступ к значениям из получателей указателей из другого файла в следующем формате:

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 ]

1 голос
/ 29 марта 2019

Всегда пишите чистый код:

  1. Имя userID не userId.
  2. Имя UserID() не GetUserId().
  3. используйте ctx2 := &myType.myType{} вместо ctx2 := *myType.myType{}.

  4. попробуйте этот код:

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 2
&{}
<nil>
0 голосов
/ 29 марта 2019

Для техники 1. Я не уверен, что logging.Debug () делает, но я думаю, что вы пытаетесь передать ему строку. В этом случае используйте ctx2.GetUserId(), а не ctx2.GetUserId. Я знаю, это звучит глупо, но для вызова функции, которая не принимает параметров, вам все равно нужны скобки.

Основная проблема заключается в том, что вы используете пакет myType, но думаете, что используете пакет типов. В противном случае я думаю, что техника 2 будет в порядке.

И, как подразумевал Фолькер о технике 3, вам нужно использовать &, а не *, чтобы получить адрес объекта.

...