Skip to content

ani8570/learngo

Repository files navigation

learngo

참고자료

예제로 배우는 Go 프로그래밍 link

노마드코더 link

사용법

  • 주의사항 및 에러

    c드라이브 아래 GO ex) c:\Go GOPATH, GOROOT, GOBIN 설정 해줌 좋음

    go.mod -> go mod init 이름

    error : cgo: exec gcc: exec: gcc: executable file not found in %PATH%

  • package 이름 작성 main은 컴파일러로 인식해서 한번만 , package 이름은 폴더로

     package main 
    
      fuc main() {
          ...
      }
    

    "fmt" : package for formatting

    fmt.Println 대문자로 시작하는 함수는 export 가능

  • 자료형

      var name string = "Lee"
    
      name := "Lee"
    

    this is sameting. but if you declared outside func, you have to declarared like this

      "var name string = "Lee"
    
  • slice선언 :

      var URLs []string // []안에 숫자가 없는게 포인트
      URLs = append(URLs, res) //res값 뒤로 추가.
      URLs = append([]string{res}, URLs...) // res값 앞에 추가
    
  • Go can return more than one.

    ex) totalLength, upperName := lenAndUpper("Lee")

    두개를 반환하는데 하나만 있는 건 안됨.

      totalLength := lenAndUpper("Lee")
    

    이건 됨

       totalLength, _ := lenAndUpper("Lee")
    

    함수가 밑과 같다

      repeatMe("nico", "lynn", "dal", "marl", "flynn")
    
  • ...string으로 여러개 받는다고 알림.

      func repeatMe(words ...string) {
          fmt.Println(words)
      }
    
  • 밑에 두 함수는 같음... 2번째 함수를 naked return이라 함 ( naked : 적나라한)

      func lenAndUpper(name string) (int, string) {
          return len(name), strings.ToUpper(name)
      }
    
      func lenAndUpper2(name string) (lenght int, uppercase string) {
          lenght = len(name)
          uppercase = strings.ToUpper(name)
          return
      }
    
  • 함수 끝나고 실행시킬 것이 있으면 defer를 사용한다. ex) 이미지 제거, 저장, api로 요청을 보낸다거나 등등

      func lenAndUpper3(name string) (lenght int, uppercase string) {
          defer fmt.Println("I'm done")
          lenght = len(name)
          uppercase = strings.ToUpper(name)
          return
      }
    

    반복문 range ->index나옴

      func superAdd(numbers ...int) int {
          fmt.Println(numbers)
          for index, number := range numbers {
              fmt.Println(index, number)
          }
          return 1
          //range
      }
    
  • if문 자체에서 변수 선언 가능

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

    switch문에서도 같음

      switch koreanAge := age + 2; {
          case koreanAge < 18:
              return false
          case koreanAge == 18:
              return true
    
          }
          return false
    
  • Go에서도 포인터와 래퍼런스 사용 가능

  • 배열도 사용 가능, 똑같이 0부터 접근

    names := [5]string{"nico", "lynn", "dal", "marl", "flynn"}
    
  • map도 사용 가능

    Lee := map[string]string{"name": "L", "age": "12"} fmt.Println(Lee)

    for key, value := range Lee { fmt.Println(key, value) }

    key값에 따라서 제거할 때

      delete(m, key) // m : map , key : string
    

    함수에서 map을 받아오면 *가 항상 붙어있다 생각하면 됨

      results := map[string]string
    

    밑에 처럼 적고 추가를 하면 panic 됨 --> map => nil

      var results = map[string]string 
    

    올바른 예

      var results = map[string]string {}
      var results = make(map[string]string) // make -> map만드는 함수
    
  • 구조체 사용가능 (외부에서 구조체 사용시 사용가능하게 하려면 대문자) (외부에서 구조체 내부 변수 사용시 사용가능하게 하려면 대문자)

      type Person struct {
          Name    string
          Age     int
          FavFood []string
      }
      type person struct {
          name    string
          age     int
          favFood []string
      }
    
      favFood := []string{"kimchi", "ramen"}
      l := person{"Lee", 25, favFood}	//can
      i := person{name: "Lee", age: 18, favFood: favFood}	//can
      i := person{name: "Lee", 18, favFood: favFood}	//can't
    
  • receiver를 가질 수 있음. receiver 규칙 : 구조체 이름의 첫번째 글자 소문자로 해서 받음.

      func (a Account) Deposit(amount int) {
          ...
      }
    
  • go routines : 메인 함수가 시작 되는 동안에 병렬 처리함. 메인 함수가 끝나면? 다 안되어도 종료시킴

      func main() {
          go sexyCount("nico")
          sexyCount("lynn") //go sexyCount("lynn") --> start and end at the same time
      }
      func sexyCount(name string) {
          for i := 0; i < 10; i++ {
              fmt.Println(name, " is sexy", i)
              time.Sleep(time.Second)
          }
      }
    
  • channel선언

      func main() {
          c := make(chan bool)
          people := [2]string{"nico", "flynn"}
          for _, person := range people {
              go isSexy(person, c)
          }
          result := <-c 
          fmt.Print(result)
    
      }
    
  • channel에서 주고받을 자료형 선언 c <- true로 값 전달 c <- person + " is sexy" func isSexy(person string, c chan bool) { //time.Sleep(time.Second * 5) for i := 0; i < 100; i++ { fmt.Println(person, " is sexy", i) //time.Sleep(time.Second) } c <- true }

      func isSexy(person string, c chan string) {
          c <- person + " is sexy"
      }
    
  • go get github.com/PuerkitoBio/goquery를 실행시켜 다운받아 HTML 내부를 들여다 볼 수 있게 해줌

      strconv.Itoa --> 숫자를 문자열로
      func strings.Join(elems []string, sep string) string // sep으로 elems를 연결
      func strings.Fields(s string) []string// 공백 단위로 구분
      func strings.TrimSpace(s string) string// 공백 제거
    

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published