2017-03-25 10 views
0

スライスから要素を削除したいと思います。しかし、私がこれを行うと、基本配列内に2つの空の要素が生成されてしまいます。 私はすでにherehere関数は、他の場所で宣言されている文字列配列のスライスのサイズを変更することはできますか? golang

package main 

import "fmt" 

//String remove adjacent duplicates from a string array 
func rmDup(str []string) []string { 
    for i := 1; i < len(str); i++ { 
     if str[i] == str[i-1] { 
      copy(str[i:], str[i+1:]) 
      str[len(str)-1] = "" 
      str = str[:len(str)-1] 
     } 
    } 
    return str 
} 

func main() { 

    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", "zebra"} 

    fmt.Println(str) 
    newstr := rmDup(str) 
    fmt.Println(str) 
    fmt.Println(newstr) 
    fmt.Println(len(str), cap(str), "final") 
    fmt.Println(len(newstr), cap(newstr), "final") 
} 

を検索メインでSTRががrmDup(で定義されたサイズ容量を返すことができることをどのような方法があります)

+2

あなたが値を変更したい場合は、その値ではなく、コピーへのポインタを必要とします。 – JimB

+0

スライスの長さと容量が変わったのとほぼ同じように動作しましたが、配列の最後の空白を取り除くことはできません。 https://play.golang.org/p/2zVBE7ZT-P –

答えて

0

は、それは私が答えを自分で見つけることができたことが判明しました。 Go言語は値による関数呼び出しを実行するため、ポインタを使用する場合を除き、別のスコープで宣言されたスライスを変更することはできません。

package main 

import "fmt" 

//String remove adjacent duplicates from a string array 
func rmDup(str *[]string) []string { 
var s = *str 
for i := 1; i < len(s); i++ { 
    if s[i] == s[i-1] { 
     copy(s[i:], s[i+1:]) 
     s[len(s)-1] = "" 
     s = s[:len(s)-1] 
    } 
} 
*str = s 
return s 
} 

func main() { 

    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", 
    "zebra"} 

    fmt.Println(str) 
    newstr := rmDup(&str) 
    fmt.Println(str) 
    fmt.Println(newstr) 
    fmt.Println(len(str), cap(str), "final") 
    fmt.Println(len(newstr), cap(newstr), "final") 
} 

出力:

[dog cat cat mouse mouse zebra zebra] 
[dog cat mouse zebra] 
[dog cat mouse zebra] 
4 7 final 
4 7 final 
1

その方法はありますstrmainは、 のサイズと容量を返します。rmDup()で定義されていますか?例えば

package main 

import "fmt" 

//String remove adjacent duplicates from a string array 
func rmDup(str []string) []string { 
    for i := 1; i < len(str); i++ { 
     if str[i] == str[i-1] { 
      copy(str[i:], str[i+1:]) 
      str[len(str)-1] = "" 
      str = str[:len(str)-1] 
     } 
    } 
    return str 
} 

func main() { 
    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", "zebra"} 
    fmt.Println(len(str), cap(str), str) 
    str = rmDup(str) 
    fmt.Println(len(str), cap(str), str) 
} 

出力:

7 7 [dog cat cat mouse mouse zebra zebra] 
4 7 [dog cat mouse zebra] 

iが 何かを返すように持つ関数rmDup()ない場所に意味しました。例えば

、出力

package main 

import "fmt" 

//String remove adjacent duplicates from a string array 
func rmDup(str *[]string) { 
    s := *str 
    for i := 1; i < len(s); i++ { 
     if s[i] == s[i-1] { 
      copy(s[i:], s[i+1:]) 
      s[len(s)-1] = "" 
      s = s[:len(s)-1] 
     } 
    } 
    *str = s 
} 

func main() { 
    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", "zebra"} 
    fmt.Println(len(str), cap(str), str) 
    rmDup(&str) 
    fmt.Println(len(str), cap(str), str) 
} 

7 7 [dog cat cat mouse mouse zebra zebra] 
4 7 [dog cat mouse zebra] 
+0

何も返さない関数rmDup –

関連する問題