Подтвердить что ты не робот

Заявление без декларации вне тела функции в Go

Я создаю библиотеку Go для API, который предлагает данные в формате JSON или XML.

Этот API требует, чтобы я запрашивал session_id каждые 15 минут или около того и использовал это в вызовах. Например:

foo.com/api/[my-application-id]/getuserprofilejson/[username]/[session-id]
foo.com/api/[my-application-id]/getuserprofilexml/[username]/[session-id]

В моей библиотеке Go я пытаюсь создать переменную за пределами main() func и намеревается выполнить ping для значения для каждого вызова API. Если это значение равно нулю или пустое, запросите новый идентификатор сеанса и т.д.

package apitest

import (
    "fmt"
)

test := "This is a test."

func main() {
    fmt.Println(test)
    test = "Another value"
    fmt.Println(test)

}

Что такое идиоматический вариант Go, чтобы объявить глобально доступную переменную, но необязательно константу?

Моя переменная test должна:

  • Быть доступным из любого места внутри него собственного пакета.
  • Быть изменчивым
4b9b3361

Ответ 1

Тебе нужно

var test = "This is a test"

:= работает только в функциях, а нижний регистр 't' таков, что он виден только пакету (не экспортируется).

Более подробное объяснение

test1.go

package main

import "fmt"

// the variable takes the type of the initializer
var test = "testing"

// you could do: 
// var test string = "testing"
// but that is not idiomatic GO

// Both types of instantiation shown above are supported in
// and outside of functions and function receivers

func main() {
    // Inside a function you can declare the type and then assign the value
    var newVal string
    newVal = "Something Else"

    // just infer the type
    str := "Type can be inferred"

    // To change the value of package level variables
    fmt.Println(test)
    changeTest(newVal)
    fmt.Println(test)
    changeTest(str)
    fmt.Println(test)
}

test2.go

package main

func changeTest(newTest string) {
    test = newTest
}

выход

testing
Something Else
Type can be inferred

В качестве альтернативы, для более сложных инициализаций пакета или для установки любого состояния, требуемого пакетом, GO предоставляет функцию init.

package main

import (
    "fmt"
)

var test map[string]int

func init() {
    test = make(map[string]int)
    test["foo"] = 0
    test["bar"] = 1
}

func main() {
    fmt.Println(test) // prints map[foo:0 bar:1]
}

Init будет вызван до запуска main.

Ответ 2

Если вы случайно используете " Func" или " функция" или " Функция" вместо " func" вы также получите:

выражение без декларации вне тела функции

Проводя это, потому что я изначально оказался здесь в своем поиске, чтобы выяснить, что не так.

Ответ 3

Мы можем объявить переменные, как показано ниже:

package main

import (
       "fmt"
       "time"
)

var test = "testing"
var currtime = "15:04:05"
var date = "02/01/2006"

func main() {
    t := time.Now()
    date := t.Format("02/01/2006")
    currtime := t.Format("15:04:05")

    fmt.Println(test) //Output: testing
    fmt.Println(currtime)//Output: 16:44:53
    fmt.Println(date) // Output: 29/08/2018
}

Ответ 4

Outside a function, every statement begins with a keyword (var, func, and so on) and so the := construct is not available.

Вы можете прочитать больше информации здесь ==> https://tour.golang.org/basics/10