Go 언어 변수


변수는 수학에서 유래하며 계산 결과를 저장하거나 값을 나타낼 수 있는 컴퓨터 언어의 추상적인 개념입니다. 변수는 변수 이름으로 접근할 수 있습니다.

Go 언어 변수 이름은 문자, 숫자, 밑줄로 구성되며 첫 문자는 숫자가 될 수 없습니다.

변수 선언의 일반적인 형식은 var 키워드를 사용하는 것입니다:

var identifier type

변수 선언

첫 번째 방법은 변수 유형을 지정하는 것입니다. 선언하면 기본값이 사용됩니다.

var v_name v_type
v_name = value

두 번째 방법은 값에 따라 변수 유형을 결정하는 것입니다.

var v_name = value

세 번째 방법, var 생략, 참고: = 왼쪽의 변수는 선언되어서는 안 됩니다. 그렇지 않으면 컴파일 오류가 발생합니다.

v_name := value

// 例如
var a int = 10
var b = 10
c : = 10

의 예시는 다음과 같습니다.

package main
var a = "w3cschoolphp中文网"
var b string = "w3cschool.cc"
var c bool

func main(){
    println(a, b, c)
}

위 예시의 실행 결과는 다음과 같습니다.

w3cschoolphp中文网 w3cschool.cc false

다변수 선언

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 //出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误


// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)

예제

package main

var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"

func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}

위 예제의 실행 결과는 다음과 같습니다.

0 0 0 false 1 2 123 hello 123 hello

값 유형 및 참조 유형

int, float, bool 및 string은 값 유형이며 이러한 유형의 변수는 직접 사용할 수 있습니다. 메모리에 저장된 값을 가리킵니다.

4.4.2_fig4.1

등호 =를 사용하여 한 변수의 값을 다른 변수에 할당하는 경우 j = i과 같은 변수, i는 실제로 메모리에 저장됩니다. 값이 복사됩니다.

4.4.2_fig4.2

&i를 사용하여 변수 i의 메모리 주소를 가져올 수 있습니다. 예: 0xf840000040(주소는 다음과 같습니다. 매번 다를 수 있습니다). 값 유형 변수의 값은 스택에 저장됩니다.

메모리 주소는 컴퓨터에 따라 다릅니다. 동일한 프로그램이라도 다른 컴퓨터에서 실행되면 다른 메모리 주소를 갖게 됩니다. 각 머신마다 메모리 레이아웃이 다를 수 있고 위치 할당도 다를 수 있기 때문입니다.

보다 복잡한 데이터에는 일반적으로 여러 단어를 사용해야 하며 이러한 데이터는 일반적으로 참조 유형을 사용하여 저장됩니다.

참조형 변수 r1은 r1의 값이 위치한 메모리 주소(숫자) 또는 메모리 주소의 첫 번째 워드 위치를 저장합니다.

4.4.2_fig4.3

이 메모리 주소를 포인터라고 하며, 이 포인터는 실제로 다른 단어에 저장됩니다.

동일한 참조 유형의 포인터가 가리키는 여러 단어는 연속적인 메모리 주소에 있을 수 있습니다(메모리 레이아웃은 연속적입니다). 이는 또한 계산상 가장 효율적인 저장 형식이기도 하며 이러한 단어는 분산되어 메모리에 저장될 수도 있습니다. , 각 단어는 다음 단어의 메모리 주소를 나타냅니다.

대입문 r2 = r1을 사용하면 참조(주소)만 복사됩니다.

r1 값이 변경되면 이 값에 대한 모든 참조는 수정된 콘텐츠를 가리킵니다. 이 예에서는 r2도 영향을 받습니다.


약식, := 할당 연산자 사용

변수를 초기화할 때 변수의 유형을 생략할 수 있으며 시스템이 자동으로 이를 추론한다는 것을 알고 있습니다. 실제로는 약간 혼란스러워 보입니다. 선언문에 var 키워드를 작성하세요. 중복되므로 a := 50 또는 b := false로 축약할 수 있습니다.

a와 b(int 및 bool)의 유형은 컴파일러에 의해 자동으로 추론됩니다.

이것은 변수를 사용하는 데 선호되는 형태이지만 함수 본문 내에서만 사용할 수 있으며 전역 변수의 선언 및 할당에는 사용할 수 없습니다. := 연산자를 사용하면 초기화 선언이라는 새 변수를 효율적으로 생성할 수 있습니다.

참고

동일한 코드 블록에서 동일한 이름을 가진 변수에 대해 초기화 선언을 다시 사용할 수 없는 경우, 예를 들어 a := 20은 허용되지 않으며 컴파일러는 error no new Variables on left side of :=라는 메시지가 표시되지만 a = 20은 동일한 변수에 새 값을 할당하므로 괜찮습니다.

변수 a를 정의하기 전에 사용하면 정의되지 않은 컴파일 오류가 발생합니다.

로컬 변수를 선언했지만 동일한 코드 블록에서 사용하지 않으면 다음 예의 변수 a와 같은 컴파일 오류가 발생합니다.

func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}

컴파일해 보세요. 이 코드에서는 선언되었지만 사용되지 않음 오류가 발생합니다.

또한 단순히 a에 값을 할당하는 것만으로는 충분하지 않으며 해당 값을 사용해야 하므로

fmt.Println("hello, world", a)

를 사용하면 오류가 제거됩니다.

단, 전역변수는 선언은 가능하지만 사용은 불가능합니다.

>

다음과 같이 동일한 유형의 여러 변수를 같은 줄에 선언할 수 있습니다.

var a, b, c int

다음과 같이 여러 변수를 같은 줄에 할당할 수 있습니다.

a, b, c = 5, 7, "abc"

위 줄은 변수 a, b, c가 선언된 것으로 가정하고 그렇지 않은 경우에는 다음과 같이 사용해야 합니다.

a, b, c := 5, 7, "abc"

오른쪽의 값은 왼쪽의 변수에 할당됩니다. 동일한 순서이므로 a 값은 5, b 값은 7, c 값은 "abc"입니다.

이를 병렬 또는 동시 할당이라고 합니다.

두 변수의 값을 바꾸려면 a, b = b, a를 사용하면 됩니다.

공백 식별자 _는 값을 삭제하는 데에도 사용됩니다. 예를 들어 값 5는 _, b = 5, 7에서 삭제됩니다.

_은 실제로 쓰기 전용 변수이므로 해당 값을 가져올 수 없습니다. 이는 Go에서는 선언된 모든 변수를 사용해야 하지만 때로는 함수의 반환 값을 모두 사용할 필요가 없기 때문에 수행됩니다.

병렬 할당은 함수가 여러 반환 값을 반환하는 경우에도 사용됩니다. 예를 들어 Func1 함수를 호출하여 val 및 error err을 동시에 얻는 경우: val, err = Func1(var1).