Go 기초

박채빈·2024년 4월 4일

Variables and Constants

func variablesAndConstants() {
	var variable string = "hello" // 1
	compact := "hello" // 2

	fmt.Println(variable, compact)

	const constant string = "hello" // 3
	fmt.Println(constant)
}

변수는 1처럼 표현하는게 기본형인데, func 안에서는 2번처럼 축약해서 쓸 수 있다.

1번의 경우 var: 변수, variable: 변수이름, string: 변수 타입 인데, 타입은 안써줘도 뒤에 들어오는 값 보고 추정해줌

상수는 3처럼 표현하면됨.

3번의 경우 const: 상수, constant: 상수이름, string: 변수 타입

Functions

func lenAndUpper(name string) (int, string) {
	return len(name), strings.ToUpper(name)
}

func multiply(a, b int) int {
	return a * b
}

func: 함수라는 뜻
lenAndUpper: 함수이름
(name string): 파리미터. string타입의 name
(int, string): 반환 타입. int, string 두개 반환

for, range, ...args

func superAdd(numbers ...int) int {
	total := 0
	for _, number := range numbers {
		total += number
	}

	return total
}
  1. 파라미터의 ...int
    int형 값을 여러 개 받겠다는 뜻.
    superAdd(1, 2, 3, 4, 5) 이렇게 쓰면됨
  2. for loop (range)
    파라미터로 받은 numbers는 리스트 처럼 볼 수 있는데, numbers 리스트의 _ , number 값을 쓰겠다는 뜻. _(언더스코어) 자리는 인덱스 자리인데, 무시하겠다는 의미. number는 해당 인덱스의 값
  3. for loop (original)
func superAdd(numbers ...int) int {
	total := 0
	for i := 0; i < len(numbers); i++ {
		total += numbers[i]
	}
	return total
}

이렇게도 쓸 수 있음

If

func ifIDrink(age int) bool {
	if age < 18 {
		return false
	}
	return true
}

func ifIDrink1(age int) bool {
	// variable expression
	if koreanAge := age + 2; koreanAge < 18 {
		return false
	}
	return true
}

기본형 if문은 별다를게 없는데, variable expression은 특이한 느낌으로 기억하면 됨

Switch

func whenIDrink(age int) bool {
	switch {
	case age < 18:
		return false
	}
	return true
}

func whenIDrink1(age int) bool {
	// variable expression
	switch koreanAge := age + 2; koreanAge {
	case 18:
		return false
	}
	return true
}

when도 if랑 별다를건 없고 variable expression 쓸 수 있음

Pointer

a := 10
b := a
a = 20

이렇게 하면 a=20, b=10임.(복사)

a := 10
b := &a
fmt.Println(a, b, *b)

이렇게 하면 b는 a의 주소값을 가지게 된다.

출력값: 10 0x1400000e0c8 10

C랑 비슷함. &는 주소, *는 주소 안의 값

a := 10
b := &a
fmt.Println(a, b, *b)
*b = 20
fmt.Println(a, b, *b)

이렇게 하면 a도 20으로 바뀜. 주소에 직접 접근하기 때문.

Arrays, Slices

func arraysAndSlices() {
	names := [5]string{"Tom", "John", "Freddy"}
	names[3] = "Anne"
	names[4] = "Marry"
	names[5] = "Error" // out of index error

	slices := []string{"Tom", "John", "Freddy"}
	slices = append(slices, "Anne")
	slices = append(slices, "Marry")
	slices = append(slices, "Harry") // 계속 추가 가능
}

Maps

func maps() {
	person := map[string]string{"name": "Tom", "age": "20"}
	fmt.Println(person)
    
    // for loop도 가능!
    for key, value := range person {
		fmt.Println(key, value)
	}
}

출력:
map[age:20 name:Tom]
age 20
name Tom

Structs

다른 언어랑 다르게 class, object가 없음

type person struct {
	name string
	age int
	favFood []string
}

func main() {
	john := person{
		name:"John Doe", 
		age:27, 
		favFood:[]string{"ramen", "kimchi"},
	}
	fmt.Println(john)
    // 용법
    john.name
    john.age
    john.favFood
}

출력:
{John Doe 27 [ramen kimchi]}

profile
안드로이드 개발자

0개의 댓글