About Go

Crossfit & Development·2021년 12월 9일
0

Go

목록 보기
1/1

Tutorial

this is Multi core

우선 go의 환경은 설치 파일을 다운받아 설치를 해줘야한다.
node 같은 경우 사용자가 임의로 설치장소를 지정하여 끌어다가 사용이 가능하지만 go 언어는 특별히 지정된 장소에서 설치되어있어야 정상 작동하게 되어있다.
(mac 사용자는 처음 설치시기에 장소를 제대로 지정하지 않는 경우 admin 폴더 공간에 설치되는 경우 개발하면서 터미널에 sudo를 무조건 치면서 해야하는 곤혹을 치룰 수 있다...주의하길 바란다.)

Packages and Import

node와는 다르게 package json은 없고
컴파일 기준이 되는 main.go 파일을 생성해 아래와 같은 패키지 메인 함수를 정의 하거나 외부에 생성한 파일함수에서 import 해야한다.

Package main 

Func main() {}

함수의 이름을 정의할때 F 와 같은 대문자로 정의하는 경우 public으로 자동지정되어 어디서는 자동 import 된다.
하지만 소문자로 하면 private화 되서 자동 import되지 않는 특징이 있다.

Variables and Constants

const name string = “name”
var(사용가능)

위 변수를 아래와 같이 축약 가능

name := “name”

이렇게 작성하는 경우 해당 값이 string인지는 go가 판단해서 값을 지정해준다.
위와 같은 shorthand 문법은 함수 내부에서만 사용가능한 점을 주의할 것

Function 작성법

위에 변수를 정의할 떄 처럼 역시 argument 정의를 할떄 타입을 정의해야한다.
그리고 리턴값도 어떤 값으로 정의되는지도 정의해줘야한다.

Func multiply (a int, b int) int{return a + b}

리턴값 정의

Func lenAndUpper(name string)(int, string)
{return len(name), strings.toUpper(name)}

Func main() 
{totalLenght, uppperName := lenAndUpper(“sean”)
Fat.PrintIn(totalLenght, upperName)}

** 변수값과 리턴값을 정의하는 방식을 유심히 참고해보자.

Naked return

Return 값을 따로 정의하지 않아도 go 에서 알아서 리턴 가능한 기능.

Multiple return value

func name (arg type)(return){definition}
Func lenAndUpper(name string) (length int, uppercase string) {
Length = len(name)
Uppercase = strings.ToUpper(name)} return 

리턴되는 값을 사전에 (length int, uppercase string) 와 같이 정의하면
별도로 리턴값을 정의하지 않아도 알아서 값을 출력할 수 있다.

defer

Func lenAndUpper(name string) (length int, uppercase string) {
Defer fmt.PrintIn(‘done’)
Length = len(name)
Uppercase = strings.ToUpper(name)} return 

위와같이 defer를 함수에 사용하게 되는 경우 해당 함수의 리턴이 완료 된 후에
defer로 정의된 부분을 마지막으로 실행하게 된다.

반복문

Func superAdd(numbers …int) int {
Total := 0
for _, number := range numbers {total += number}return total }

for _ 는 앞의 값을 무시하고 넘어간다.
range는 index값을 만들어주면서 반복으로 사용한다.

조건문

func canIDrink(age int) bool {
If age < 18 {return false} return true}

여기서 else를 작성하면 굳이 필요없다는 안내문과 함께 삭제하게된다.
variable expression

func canIDrink(age int) bool {
If koreaAge := age + 2;  koreaAge < 18 
{return false} return true}

여기서는 조건문 내부에 변수를 따로 정의해서 조건내 추가 조건을 설정할 수 있다.
다른 언어에는 없는 특징이라 사용하는데 더 요긴하게 쓰일 수 있는 부분이 되겠다.

Pointer	
Func main() {
a := 2
b := &a
*b = 2020
fmt.PrintIn(a)
}

&는 데이터의 메모리를 지칭할떄 사용하며
*는 메모리 내부를 흝어볼떄 사용되나 위와 같이 사용하는 경우
지칭하는 변수의 값을 overiding 할 수 있게 된다.

Array and slice

Func main(){
names:= [5]string{“nico”, “lynn”, “dal”}
names[3] = “plus”
fmt.PrintIn(names)}

배열을 정의할때 [index길이]string(“1”, “2”) 와 같이 정의할 수 있으며, 출력하면 출력을 해주나, 빈 인덱스에 names[3] = “plus” 이와 같이 추가가 가능하다.
*인덱스를 초과해서 입력하는 경우는 당연히 추가할 수 없다.

Func main(){
names:= []string{“nico”, “lynn”, “dal”}
names = append(names, “plus”)
fmt.PrintIn(names)}

배열 정의시 아래오 같이 하면, 정의된 내용에 맞게 index가 부여되며

names:= []string{“nico”, “lynn”, “dal”}

꽉찬 배열에 내용을 첨부할 때에는 위와 같이 append를 사용해서 추가할 수 있다.

Public private 
package main

import "std/github.com/sean/learngo/banking"

func main() {
    account := banking.Account{Owner: sean, Balance: 00}

}

package banking

// Account struct
type Account struct {
    Owner   string
    Balance int
}

위와 같이 정의된 변수의 이름의 앞에 대문자로 되어있으면, public
소문자로 되어 있는 경우 private이다.
위에 구성한 스트럭쳐를 불러서 사용할 수 있게 하려면 public으로 정의하고 사용해야 해당 스트럭쳐를 임포트 할 수 있는데 이렇게 사용하는 경우 account의 사용자 이름을 임의로 변경하거나 그외의 값을 제3자가 임의로 변경 할 수 있다.

func NewAccount(owner string) *Account {
    account := Account{owner: owner, balance: 0}
    return &account
}

*위의 내용을 해결하기 위해 데이터를 새롭게 복사하여 생성 할 수 있도록
포인터를 활용하여 코드를 구성하면 새롭게 생성된 인스턴스에 접근하여 private으로
안전하게 데이터를 임의로 수정할 수 없도록 하게 할 수 있다.

profile
새로운 기술, 새로운 운동을 탐구합니다.

0개의 댓글