Golang如何从命令行写入单词序列

Golang如何从命令行写入单词序列 你好,我正在尝试完成这个练习: 编写一个程序,从命令行接收一系列任意长度的单词,并打印出最长的单词。如果有多个单词长度相同且都是最长的,则程序打印最后一个。例如,如果用户输入单词序列 “one two four thirteen”,程序将打印 “thirteen”。 请注意:

  1. 数据来自命令行
  2. 我们有一个可以按顺序、以统一方式处理的数据序列
  3. 这些数据是字符串
  4. 程序启动时输入的所有数据都已存储在切片 os.Args

我正在编写代码,但不知道如何设置与命令行中写入的参数相关的 main 函数。我写了以下代码:

package main

import (
    "fmt"
    "os"
    "strings"
)

func longestword(s string) (best string) {
    for _, word := range strings.Split(s, " ") {
        if len(word) > len(best) {
            best = word
        }
    }
    return
}

func main() {
    var arg string
    for _, arg = range os.Args[1:] {
        fmt.Println(arg)
    }
}

是否有某个函数可以识别最长的单词?


更多关于Golang如何从命令行写入单词序列的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

虽然在这个用例中可能没人会注意到,但排序的时间复杂度是 O(n log n),而这个问题可以用原帖代码中 O(n) 的线性搜索来解决。原帖作者只需要修正几个小错误,并把各个部分正确地组合起来即可。

更多关于Golang如何从命令行写入单词序列的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我不知道如何设置与命令行中写入的参数相关的 func main

如果我理解正确的话,您要找的是 os.Args

希望对您有所帮助。

为什么不先对字符串进行排序,然后取第一个元素呢?

package main

import (
	"fmt"
	"os"
	"sort"
)

func main() {
	if len(os.Args) > 1 {
		s_data := os.Args[1:]
		sort.Slice(s_data, func(i, j int) bool { return len(s_data[i]) >= len(s_data[j]) })
		fmt.Printf("The longest command line arg: '%s'\n", s_data[0])
	}
}

你的代码已经接近完成,但需要调整处理命令行参数的方式。os.Args 切片包含了所有命令行参数,其中 os.Args[0] 是程序名,os.Args[1:] 才是用户输入的单词序列。不过,你的 longestword 函数期望一个用空格分隔的字符串,而 os.Args[1:] 已经是按空格分割后的切片了。因此,可以直接遍历 os.Args[1:] 来找到最长的单词。以下是修改后的代码:

package main

import (
    "fmt"
    "os"
)

func main() {
    var longest string
    for _, word := range os.Args[1:] {
        if len(word) >= len(longest) {
            longest = word
        }
    }
    fmt.Println(longest)
}

这个程序会遍历命令行参数(从 os.Args[1] 开始),比较每个单词的长度,并更新 longest 变量。由于使用 >= 进行比较,当有多个单词长度相同时,会保留最后一个最长的单词。例如,输入 go run main.go one two four thirteen 会输出 thirteen

回到顶部