{Go} 5. string / 6.array & slice / 7. map

Jerry·2021년 6월 19일
0

5. string

문자열 인덱스 범위로 substring 추출

var str string = "Golang"
	fmt.Println(str[0:2], str1[0],str[3:],str[:4])

문자열 결합 : join

문자열을 일반 + 연산으로 연결할 시에 매번 새로운 문자열 조합의 객체를 생성한다.
buffer 기반의 strings.Join 함수를 이용하면 비효율적인 연산 문제를 해결할수 있다.

import (
	"fmt"
	"strings"
)
...

str1 := "golang"
str2 := "hello"

strSet := []string{} //슬라이스 선언
strSet = append(strSet, str1)
strSet = append(strSet, str2)
fmt.Println("ex2 : ", strings.Join(strSet, ""))

6. array / slice

array : 배열

  • 길이 고정
  • value 타입 => 전달시 복사 전달
  • 비교연산자 사용 가능

slice : 슬라이스

  • 길이 가변
  • reference 타입 => 전달 시 참조 값 전달
  • 비교연산자 사용 불가
  • 용량만큼의 버퍼 생성
    용량 생략 시 용량 = 길이
  • 런타임에서 길이가 용량을 초과할경우, 이전 용량의 2배만큼 확장한다. (caps(s)*2)
    용량을 초과하여 버퍼를 할당할 경우 새로운 크기만큼의 메모리할당과 데이터 복사가 일어남
  • subslice 추출하여 조작시 원본도 함께 바뀜을 유의
slice2 := make([]int, 5, 5)
for i := 0; i < 30; i++ {
	slice2 = append(slice2, i)
	fmt.Println(i, " : caps : ", cap(slice2))
}
  • 효율적으로 메모리를 쓰면서도 용량 확장 시 오버헤드가 되지 않을 적절한 용량 선택이 필요

slice 생성

  1. 배열처럼 선언
var slice1 []int
slice2 := []int{}
slice3 := []int{1, 2, 3, 4, 5}
slice4 := [][]int{
	{1, 2, 3, 4, 5},
	{6, 7, 8, 9, 10},
}
  1. make 함수 : make(자료형, 길이, 용량(생략시 길이만큼 할당))
s2 := make([]int, 5, 5)

slice 추가 및 병합

s1 := []int{1, 2, 3, 4, 5}
s2 := []int{8, 9, 10, 11, 12}
    
s1 = append(s1, 6, 7)
s2 = append(s1, s2...)      // slice에 slice를 붙일때는 ... 붙여줌
s3 = append(s2, s3[0:3]...) //s3[0:3] : 13,14,15

7. map

  • key-value 형태로 자료 저장
  • reference 타입
  • key는 값(value) 타입만 가능
  • make 함수 및 짧은선언(리터럴) 방식으로 초기화 가능
  • iterate시 순서 보장 안됨

    When iterating over a map with a range loop, the iteration order is not specified and is not guaranteed to be the same from one iteration to the next. If you require a stable iteration order you must maintain a separate data structure that specifies that order.

    [참고] Go 블로그 : https://blog.golang.org/maps#TOC_7.

선언 및 초기화

// 1. 정석
var map1 map[string] int = make(map[string]int)   // key:string value:int
// 2.자료형 생략
var map2 = make(map[string]int)
// 3.짧은 선언 : 리터럴
map3:=make(map[string]int)
// 3-1. 짧은 선언2
map4:=map[string]int{} 

// 4. 선언과 동시에 초기화
map5:=map[string]int{
  "apple":15,
  "banana":40,
  "orange":23,
}

// insert
map5["lemon"] = 100 // 추가

Itereate 출력

map1 := map[string]string{
	"daum":   "http://daum.net",
	"naver":  "http://naver.com",
	"google": "http://google.com",
}

// 순서 보장 안되므로 랜덤 순서로 출력
for k, v := range map1 {
	fmt.Println("ex2 : ", k, v)
}

for _, v := range map1 {
	fmt.Println("ex2 : ", v)
}

데이터 사용

value1 := map1["lemon"] // lemon 키에 해당하는 value 리턴
value2, ok := map1["lemon"] // ok에는 key가 존재하는지 안하는지에 대한 부울값이 리턴됨.

// 논리 연산에 응용하여 사용
if value, ok := map1["kiwi"]; ok {
	fmt.Println("ex2 :", value)
} else {
	fmt.Println("ex2 : kiwi is not exist")
}

참고자료

[학습 자료] 인프런 - 쉽고 빠르게 끝내는 GO언어 프로그래밍 핵심 기초 입문 과정
[공식사이트] https://golang.org/tutorial

profile
제리하이웨이

0개의 댓글