반응형

Go 1.21, slice 기능 지원

 

출처: https://qiita.com/yuya_sega/items/13542f0e30945760c359

 

파이썬의 슬라이싱 문법을 기대했는데, 그런 건 아니군요.

새로운 기능이라니 참고하세요.

 

Contains

s 슬라이스에 값 v가 있는지 확인하고, 존재하면 true를 반환한다.

func Contains[S ~[]E, E comparable](s S, v E) bool

 

샘플

m := []string{"taro", "jiro", "saburo"}

ok := slices.Contains(m, 
"jiro")

fmt.Println(fmt.Sprintf(
"%t", ok)) // true

 

이전에는 이렇게 했다

func contains(slice []string, key string) bool {
        m := 
make(map[string]struct{}, len(slice))
        
for _, s := range slice {
                m[s] = 
struct{}{}
        }
        _, ok := m[key]
        
return ok
}

 

Insert / Delete

Insert: s 슬라이스 내의 i 위치에 v를 추가하고 반환한다

Delete: s 슬라이스 내에 있는 요소를 i 에서 j 위치까지 삭제하고 반환한다

func Insert[S ~[]E, E any](s S, i int, v ...E) S

func Delete[S ~[]E, E any](s S, i, j int) S

 

샘플

m := []string{"taro", "jiro", "saburo"}

m = slices.Insert(m, 
len(m), "siro")
fmt.Println(fmt.Sprintf(
"%v", m)) // [taro jiro saburo siro]

m = slices.Delete(m, 
len(m)-1, len(m))
fmt.Println(fmt.Sprintf(
"%v", m)) // [taro jiro saburo]

 

이전에는 이렇게 했다

m := []string{"taro", "jiro", "saburo"}

m = 
append(m, "siro")
fmt.Println(fmt.Sprintf(
"%v", m)) // [taro jiro saburo siro]

m = 
append(m[:len(m)-1], m[len(m):]...)
fmt.Println(fmt.Sprintf(
"%v", m)) // [taro jiro saburo]

 

Index

func Index[S ~[]E, E comparable](s S, v E) int

 

s 슬라이스에 v가 있는 위치를 반환한다. 존재하지 않으면 -1이 반환된다.

 

샘플

m := []string{"taro", "jiro", "saburo"}

searchKeys := []
string{"jiro", "siro"}

for _, skey := range searchKeys {
   
if idx := slices.Index(m, skey); idx != -1 {
       fmt.Println(fmt.Sprintf(
"%s is found.", m[idx]))
       
continue
   }
   fmt.Println(fmt.Sprintf(
"%s is not found.", skey))
}
// jiro is found.
// siro is not found.

 

샘플 케이스

 

슬라이스의 특정 문자를 삭제

import (
        
"fmt"
        
"slices"
)

// jiro 를 삭제하고 싶다
func main() {
        m := []
string{"taro", "jiro", "saburo"}

        
if idx := slices.Index(m, "jiro"); idx != -1 {
                m = slices.Delete(m, idx, idx+1)
        }

        fmt.Println(fmt.Sprintf(
"%v", m)) // [taro saburo]
}

 

 

슬라이스에 지정된 문자가 없으면 삽입

import (
        
"fmt"
        
"slices"
)

func main() {
        m := []
string{"taro", "jiro", "saburo"}

        
if exists := slices.Contains(m, "siro"); !exists {
                m = slices.Insert(m, 
len(m), "siro")
        }

        fmt.Println(fmt.Sprintf(
"%v", m)) // [taro jiro saburo siro]
}

 

 

 

반응형

+ Recent posts