Go - 01. go theory (2)
If with a Twist
go언어도 if-else 사용이 가능하다. 주의할 점은 괄호가 반드시 있어야 컴파일이 된다.
package main
import (
"fmt"
)
func canIDrink(age int) bool {
if koreanAge := age + 2; koreanAge < 18 { //if문 내에서 변수 선언이 가능
return false
}
return true
}
func main() {
fmt.Println(canIDrink(16))
}
Switch
go언어도 switch 사용이 가능하다.
package main
import (
"fmt"
)
func canIDrink(age int) bool {
switch koreanAge := age + 2; koreanAge { //switch문 내에서 변수 선언 가능
case 10:
return false
case 18:
return true
}
return false
}
func main() {
fmt.Println(canIDrink(16))
}
아래 방식으로도 switch를 사용할 수 있다.
package main
import (
"fmt"
)
func canIDrink(age int) bool {
switch {
case age < 18:
return false
case age == 18:
return true
case age > 50:
return false
}
return false
}
func main() {
fmt.Println(canIDrink(16))
}
Pointers!
포인터를 사용하는 방식은 C++과 유사하지만 조금 다르다. Low-level Programming이 가능하다.
package main
import "fmt"
func main() {
a := 2
b := &a //b에 a의 주소를 저장
*b = 20 //b에 저장된 주소에 해당하는 메모리, 즉 a에 20 저장
fmt.Println(a) //20을 출력
}
Arrays and Slices
배열을 선언하는 방법은 다른 언어와 같다.
package main
import "fmt"
func main() {
names := [5]string{"nico", "lynn", "dal"}
names[3] = "alala"
names[4] = "alala"
names[5] = "alala" //이부분에서 범위 밖을 참조하여 오류가 남
fmt.Println(names)
}
go언어에는 C#의 Arraylist와 유사한 Slice가 있다. Slice는 배열의 크기를 선언하지 않고 Arraylist처럼 유동적으로 값을 추가하고 뺄 수 있다.
추가를 할때는 append를 사용하며 값을 추가한 새로운 Slice를 리턴한다. 자주 사용되는 기능이다.
package main
import "fmt"
func main() {
names := []string("nico", "lynn", "dal")
names = append(names, "flynn") //값을 추가한 새로운 Slice를 리턴함
fmt.Println(names)
}
Maps
go언어도 map 사용이 가능하다. data := map[key]value{"key": value}
package main
import "fmt"
func main() {
nico := map[string]string{"name": "nico", "age": "12"} //"key" : value
for key, _ := range nico {
fmt.Println(key)
}
}
Structs
class와 object를 합친 듯한 struct를 go언어에서도 사용이 가능하다. struct는 python의 __init__
과 같은 생성자가 없다.
package main
import "fmt"
type person struct { //struct 선언
name string
age int
favFood []string
}
func main() {
favFood := []string{"kimchi", "ramen"}
nico := person{name: "nico", age: 18, favFood: favFood} //선언 시 var: value로 해주는게 좋음
fmt.Println(nico.name)
}