2013-12-11 14 views
25

Tôi đang tạo thư viện Go cho API cung cấp dữ liệu có định dạng JSON hoặc XML.Tuyên bố không khai báo bên ngoài nội dung hàm trong Go

API này yêu cầu tôi yêu cầu session_id cứ 15 phút một lần hoặc lâu hơn và sử dụng trong cuộc gọi. Ví dụ:

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

Trong thư viện Go của tôi, tôi đang cố gắng để tạo ra một biến bên ngoài của main() func và có ý định ping nó cho một giá trị cho mỗi cuộc gọi API. Nếu giá trị đó là nil hoặc trống, hãy yêu cầu id phiên mới v.v.

package apitest 

import (
    "fmt" 
) 

test := "This is a test." 

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

} 

Thành ngữ là cách nào để khai báo biến toàn cục, nhưng không phải là hằng số một lần?

test My nhu cầu biến:

  • Hãy truy cập từ bất cứ nơi nào trong gói riêng của nó.
  • Hãy thay đổi

Trả lời

31

Bạn cần

var test = "This is a test" 

:= chỉ hoạt động trong các chức năng và các trường hợp 't' thấp hơn là để nó chỉ hiển thị cho các gói (unexported).

Một hơn thông qua explenation

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 
} 

đầu ra

testing 
Something Else 
Type can be inferred 

Cách khác, để khởi tạo gói phức tạp hơn hoặc thiết lập bất kỳ trạng thái nào được yêu cầu bởi gói GO cung cấp một hàm 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 sẽ được gọi trước khi chạy chính.

+0

Tại sao kiểu khởi tạo này hoạt động? – sergserg

+0

Nếu có bộ khởi tạo, loại có thể được bỏ qua; biến sẽ lấy kiểu của bộ khởi tạo. – robbmj

7

Nếu bạn vô tình sử dụng "Func" hoặc "chức năng" hoặc "Chức năng" thay vì "func" bạn cũng sẽ nhận được:

tuyên bố

không khai báo bên ngoài chức năng body

Đăng bài này vì ban đầu tôi đã tìm kiếm để tìm hiểu xem có gì sai.

+1

hoặc nếu bạn gõ func, hãy bỏ trống khoảng cách giữa tên và chức năng – JGurtz

Các vấn đề liên quan