Skip to content

Commit 437cd39

Browse files
authored
Merge pull request #887 from devlights/add-go124-strings-lines-example
2 parents 5dc6ff2 + 78aae4a commit 437cd39

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed

examples/basic/byteop/go124_bytes_lines.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,22 @@ func Go124BytesLines() error {
5858
}
5959

6060
return nil
61+
62+
/*
63+
$ task
64+
task: [build] go build -o "/workspace/try-golang/try-golang" .
65+
task: [run] ./try-golang -onetime
66+
67+
ENTER EXAMPLE NAME: byteop_go124_bytes_lines
68+
69+
[Name] "byteop_go124_bytes_lines"
70+
71+
1:
72+
2: # try-golang
73+
3:
74+
4: This is my TUTORIAL project for golang.
75+
5:
76+
77+
[Elapsed] 127.78µs
78+
*/
6179
}

examples/basic/strs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
| trimspace.go | string_trim_space | strings.TrimSpace() のサンプルです. |
1616
| random_string.go | string_random_string | 指定された文字数のランダム文字列を作成するサンプルです. |
1717
| split_fields.go | string_split_fields | strings.Fields() のサンプルです. |
18+
| go124_strings_lines.go | string_go124_strings_lines | Go 1.24 で追加された strings.Lines() のサンプルです. |

examples/basic/strs/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2525
m["string_trim_space"] = TrimSpace
2626
m["string_random_string"] = RandomString
2727
m["string_split_fields"] = SplitFields
28+
m["string_go124_strings_lines"] = Go124StringsLines
2829
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package strs
2+
3+
import (
4+
"fmt"
5+
"iter"
6+
"os"
7+
"strings"
8+
"unsafe"
9+
)
10+
11+
// Go124StringsLines は、Go 1.24 で追加された strings.Lines() のサンプルです.
12+
//
13+
// Go 1.23 で追加されたイテレータを返すようになっています。
14+
// strings.Lines()は、文字列を '\n' で区切ったデータをイテレータで提供してくれます。
15+
// このデータには '\n' 自身も付いた状態で取得出来るので、その点には注意が必要。
16+
// (fmt.Println()でそのまま出力すると2個改行が入ることになる)
17+
//
18+
// # REFERENCES
19+
// - https://pkg.go.dev/strings@go1.24.0#Lines
20+
// - https://tip.golang.org/doc/go1.24#stringspkgstrings
21+
// - https://tip.golang.org/doc/go1.23#iterators
22+
func Go124StringsLines() error {
23+
var (
24+
// 最初のN行のみに絞るためのイテレータ関数
25+
firstN = func(n int, lines iter.Seq[string]) iter.Seq[string] {
26+
return func(yield func(string) bool) {
27+
count := 0
28+
for line := range lines {
29+
if count >= n || !yield(line) {
30+
return
31+
}
32+
33+
count++
34+
}
35+
}
36+
}
37+
// 前に番号を付与するイテレータ
38+
withLineNum = func(lines iter.Seq[string]) iter.Seq[string] {
39+
return func(yield func(string) bool) {
40+
count := 1
41+
for line := range lines {
42+
if !yield(fmt.Sprintf("%2d: %s", count, line)) {
43+
return
44+
}
45+
46+
count++
47+
}
48+
}
49+
}
50+
// []byteからstringへ変換するためのヘルパー関数
51+
toStr = func(b []byte) string {
52+
return unsafe.String(unsafe.SliceData(b), len(b))
53+
}
54+
55+
data, _ = os.ReadFile("README.md") // ファイルデータを読み出して
56+
lines = strings.Lines(toStr(data)) // 行単位にして
57+
first5 = firstN(5, lines) // 先頭5行のみにして
58+
withNum = withLineNum(first5) // 行番号を付与
59+
)
60+
61+
for line := range withNum {
62+
fmt.Printf("%s", line)
63+
}
64+
65+
return nil
66+
67+
/*
68+
$ task
69+
task: [build] go build -o "/workspace/try-golang/try-golang" .
70+
task: [run] ./try-golang -onetime
71+
72+
ENTER EXAMPLE NAME: string_go124_strings_lines
73+
74+
[Name] "string_go124_strings_lines"
75+
76+
1:
77+
2: # try-golang
78+
3:
79+
4: This is my TUTORIAL project for golang.
80+
5:
81+
82+
[Elapsed] 94.12µs
83+
*/
84+
}

0 commit comments

Comments
 (0)