Golang - 함수, 상수,if, Switch, for
🔥 함수
함수의 구조에 대해서 알아보았습니다.
func 이름(인자 int, 인자 int) 반환타입{
return a + b
}
- 별로 어려운 구조는 아닙니다.
호이스팅과 비슷한 형식을 지원하기 떄문에
먼저 정의된 함수만 사용이 가능한 구조는 아닙니다.
a 함수
func main(){
a()
}
- 이것도 가능하지만
func main(){
a()
}
a 함수
- 이것도 가능합니다.
- 만약 들어오는 인자의 타입이 같을떄에는 타입을 하나만 적어도 됩니다.
- 또한 Solidity와 반환값을 여러개 선정해 줄수 있습니다.
함수를 다루는 부분은 익숙하니 재귀도 같은 맥락으로 구현 가능합니다
🔥 상수
상수 부분은 정말 단순하지만 구조체와 비슷한게 단체로 적용 가능한 부분이 있어서 이 부분만 다루어 보았습니다.
// ()를 통해서 상수를 한번에 선언 가능
const(
Red int = iota // 0
Blue int = iota // 1
Green int = iota // 2
)
- iota는 1씩 증가하는 용어이며 이처럼 사용가능하다
const(
Red int = iota + 1 // 0 + 1 =1
Blue // 1 + 1 = 2
Green // 2 + 1 = 3
)
- 이런식으로도 활용이 가능하다.
const(
Red int = 1 << iota // 1 = 1 <<o
Blue // 2 = 1 << 1
Green // 4 = 1 << 2
black // 8 = 1 << 3
)
- 좀더 심화하여 사용하면 이런식으로 활용이 가능합니다.
- 이를 bitFlag라고 합니다.
BitFlag를 활용한 예시 코드
- Youtube참고한 코드
package main
import "fmt"
type Room uint8
const (
Master = Room = 1 << iota // iota = 0 이므로 1을 의미
Bath // 2
Kitchen // 4
Living // 8
)
func SetLight(rooms, room Room) Room{
return rooms | room
}
func ResetLight(rooms, room Roomo) Room{
return rooms &^ room
}
func Isturnon(rooms, room Room) bool {
return rooms & room == room
}
func TurnonLight(rooms Room){
if Isturnon(rooms, Master){
fmt.Println("turn on Master)
}
// 이 과정을 상수값들마다 적어줌
}
func main(){
var rooms Room // 초기화를 안하면 초기값은 0
rooms = SetLight(rooms, Master)
rooms = SetLight(rooms, Living)
TurnonLight(rooms)
}
불을 키고 끄는 과정을 코드로 표현을 한것입니다.
어떤식으로 작동을 하는지를 살펴보면
Master => 0001
Bath => 0010
Kithcn => 0100
Living => 1000
rooms => 0000
초기에 값들은 이런식으로 구성이 되어 있습니다.
만약 SetLight함수를 통하게 되면
- Master과 rooms를 인자로 넣어주면
0001
0000
==> 0001 이 완성이 됩니다.
이값을 다시 rooms로 갱신을 하고 다음 과정을 같은 작업으로 진행을 하게 됩니다.
코드에는 적지 않았지만 만약 ResetLight를 실행시키면
- Living까지 진행이 되었고 이후 Living을 끈다는 가정
1001 == rooms
1000 == Living
우선 ^를 실행을 하게 됩니다.
1001 == rooms
0111 == ^Living
이후 &를 통해서 같은 값들끼리만 연결이 되면
결과 : 0001 이 되게 됩니다.
- 이러한 과정을 통해 불을 켜고 끄는 것을 bit값을 통해서 수정이 가능합니다.
- 자주 쓰는 형태는 아니지만 사용을 해야 할떄가 있는 방법입니다.
보통 a = b
라는 구문을 생각해보면 a에 b의 값을 대입한다는 의미가 됩니다.
이떄 b의 값이 a의 메모리 주소에 할당이 되는 방식으로 작동을 하게 되고 결과적으로는
왼쪽은 메모리 주소, 오른쪽은 값을 나타내게 됩니다.
하지만 기본적으로 상수를 a의 위치에 두고 b를 값에 위치에 둘수는 없습니다.
- 초기화 부분 말고 이미 변수가 선언되어 있는 상태에서 다시 초기화 하는 것을 말합니다.
왜냐하면 상수는 변수와 다르게 따로 메모리 주소를 할당하지 않기 떄문입니다.
- 즉 메모리 공간에 주소공간이 따로 있는 것이 아니라 그냥 박혀있다?? 는 의미로 이해를 하면 될것 같습니다.
🔥 IF문
사실 if문은 다른 언어와 유사함과 동시에 같습니다.
하지만 다른 부분을 발견하였고 해당 부분에 대하여 학습을 하였습니다.
if filename, success := 함수; success(조건문){
~~~
}
함수의 결과에 따라서 if문을 통과시키는 코드 입니다.
- 반환되는 값이 filename, success 두가지가 있기 떄문에 함수 또한 두가지를 반환한다는 것을 알수 있습니다.
또한 Golang에서는 ;
를 사용하지는 않지만 특이케이스로 이렇게 구분해야 하는 경우가 생긴다면 사용하게 됩니다.
예를들어보면
func 함수 () bool {
return 3, true
}
func main() {
if a, b := 함수; b {
fmt.Println("success!!")
}
}
함수는 반드시 true값을 출력하기 떄문에 a=3, b=true값을 가진다는 것을 알 수가 있고
이런 조건에서는 if문은 통과가 이루어 진다는 것을 확인할수 있습니다.
🔥 Switch문
기본적인 구조는 이전에 알던 Switch문과 동일합니다.
- if문을 반복해서 사용하기 싫을때 사용
- 값을 통해서 비교를 할때 사용
package main
import "fmt"
type ColorType int
const (
Red ColorType = iota
Blue
Green
Yellow
)
func colorToString(color ColorType) string {
switch color {
case Red:
return "RED"
case Blue:
return "Blue"
// fallthrough
case Green:
return "Green"
case Yellow:
return "Yellow"
default:
return "No Color!!"
}
}
func getMyFavoriteColor() ColorType {
return Red
}
func main() {
fmt.Println("Myfavorite color is", colorToString(getMyFavoriteColor()))
// 아무것도 주지 않으면 0과 같기 떄문에 iota에 의해서 0이 됩니다.
// 인자로 줄수 있는 부분은 Type의 형태에 의해서 int값만 들어 갈수 있습니다.
}
- 간단한 Switch를 통한 테스트 코드 입니다!
- Golang에서는 원하는 값을 찾게 되면 바로 break가 작동이 되기 떄문에 굳이 적어주지 않아도 됩니다.
만약 검색이 완료가 되어도 break문을 작동시키고 싶지 않다면
- fallthrough를 추가해 주면 됩니다.
🔥 for
기본적인 형태는 이와 같습니다.
for 초기문; 조건문; 후처리 {
~~~
}
- ()적어주지 않아도 됩니다.
- break, continue부분도 같은 방식으로 작동합니다.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin)
for {
fmt.Println("숫자를 입력하세요!")
var number int
//
_, err := fmt.Scanln(&number)
// _의 역할을 사용하지 않고 싶은 변수일 경우 사용합니다.
if err != nil {
fmt.Println(err)
// 버퍼를 지워줍니다
stdin.ReadString('\n')
// return값으로는 string, err가 나오게 됩니다.
continue
}
fmt.Printf("입력한 숫자는 %d입니다.\n", number)
if number%2 == 0 {
fmt.Println("2로 나눠지는 값이기 때문에 for문을 종료합니다")
break
}
}
fmt.Println("for문이 종료되었습니다")
}
- 이또한 간단하게 작성한for문 활용 예시입니다.
다음에는 break문 입니다.
제가 학습햇던 부분과 다르지는 않지만 그래도 정리를 해볼겸 적어보았습니다.
func main() {
a := 1
b := 1
flag := false
for ; a <= 9; a++ {
for b = 1; b <= 9; b++ {
if a*b == 45 {
flag = true
break
}
}
if flag {
break
}
}
fmt.Println(a * b)
}
- 단순히 2중 for문을 벗어나는 코드입니다.
이런식으로 flag라는 변수를 통해서 벗어날수도 있지만 label을 통해서도 벗어날수 있습니다.
- 3중 for문이 되면 중복되는 부분이 많아지니깐 이러한 부분에서 적용을 하는 경우에 사용 합니다.
func main() {
a := 1
b := 1
OuterFor:
for ; a <= 9; a++ {
for b = 1; b <= 9; b++ {
if a*b == 45 {
break OuterFor
}
}
}
fmt.Println(a * b)
}
이렇게 for문에 이름을 짓어준다는 느낌으로 활용하면 됩니다.
- 사실 label은 되도록 사용하지 않는 편이 좋습니다.
Author And Source
이 문제에 관하여(Golang - 함수, 상수,if, Switch, for), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jjimgo/Golang-함수-상수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)