JD의 블로그

고랭(golang) 기초(2) 본문

-프로그래밍 언어/Golang

고랭(golang) 기초(2)

GDong 2020. 1. 21. 23:09

기본 자료형

  • 불리언
    • bool
  • 문자열
    • string
  • 정수
    • int, int8, int16, int32(rune), int64
    • uint, uint8(byte), uint16, uint32, uint64, uintptr
  • 실수
    • float32, float64
  • 복소수
    • complex64, complex128

 

구조체(Structs)

필드(데이터)들의 조합

type 선언으로 struct의 이름을 지정할 수 있다.

package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	fmt.Println(Vertex{1,2})
}
  • 구조체 리터럴(Struct Literals) : 필드와 값을 나열해서 구조체를 새로 할당하는 방법
import "fmt"

type Vertex struct{
	X, Y int
}

var {
	p = Vertex{1, 2}
    q = &Vertex{1, 2}
    r = Vertex{X: 1}
    s = Vertex{}
}

func main() {
	fmt.Println(p, q, r, s)
}

result: {1 2} &{1 2} {1 0} {0 0}

 

포인터(Pointers)

  • Go에도 포인터가 있지만 포인터 연산은 불가능하다.
  • 구조체 변수는 구조체 포인터를 이용해서 접근 할 수 있다.
  • 포인터를 이용하는 간접 접근은 실제 구조체에도 영향을 미친다. 
package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
	p := Vertex{1, 2}
    q := &p
    q.X = 1e9
    fmt.Println(p)
}

result: {1000000000 2}

 

new 함수

  • new(T) : T는 타입의 종류, 모든 필드가 0이 할당된 T 타입의 포인터를 반환한다.
var t *T = new(T)   or     t:= new(T)

# example
package main

import "fmt"

type Vertex struct {
	X, Y int
}

func main() {
	v := new(Vertex)
    fmt.Println(v)
    v.X, v.Y = 11, 9
    fmt.Println(v)
}

 

슬라이스(Slices)

  • 슬라이스는 배열의 값을 가리키며 배열의 길이를 가지고 있다.
  • [ ] T 는 타입 T를 가지는 요소의 슬라이스(slice)이다.
  • 슬라이스는 슬라이스 자르기(Slicing slices)도 지원 ex ) s[lo:hi] => lo 에서 hi-1의 요소를 포함하는 슬라이스
package main

import "fmt"

func main() {
	p := []int{2, 3, 5, 7, 11, 13}
    fmt.Println("p ==", p)
    
    for i := 0; i < len(p); i++ {
    	fmt.Println("p[%d] == %d\n",
        	i, p[i])
    }
}

 

  • 슬라이스 만들기
    • 슬라이스는 make 함수로 만들 수 있다. 이렇게 생성된 슬라이스는 0을 할당한 배열을 생성하고, 그것을 참조한다.
package main

import "fmt"

func main() {
	a := make([] int, 5)
    printSlice("a", a)
    b := make([] int, 0, 5)
    printSlice("b", b)
}

func printSlice(s stinrg, x []int) {
	fmt.Printf("%s len=%d cap=%d %v\n",
    	s, len(x), cap(x), x)
}

result : 
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []

레인지(Range)

  • python의 enumerate와 유사, for 문에서 range를 통해 슬라이스나 맵을 순회할 수 있다.
package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main(){
	for i, v := range pow {
		fmt.Printf("2**%d = %d\n", i, v)
    }
}

result:
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
  • _ 를 이용해서 인덱스(index)나 값(value)을 무시할 수 있으며, 값을 적지 않으면 인덱스만 표시된다.

 

연습 : 슬라이스

Pic 이라는 함수를 구현한다. 이 함수는 dy개 만큼의 길이를 가지는 슬라이스를 리턴해야 하는데, 각각의 요소들은 또한 dx개의 8비트 부호없는 8비트 정수 타입을 가지는 슬라이스이다. 

더보기
package main

import "code.google.com/p/go-tour/pic"

func Pic(dx, dy int) [][]uint8 {
	a := make([]uint8, dx)
    b := make([][]uint8, dy)
    
    for i := range a {
    	a[i] = uint8(i)
    }
    
    for i := range b {
    	b[i] = a
    }
    
    return b
}

func main() {
	pic.Show(Pic)
}

 

결과값

 

'-프로그래밍 언어 > Golang' 카테고리의 다른 글

고랭(Golang) 기초(1)  (1) 2020.01.19