首页 > 编程语言 >抽象的艺术:Go 语言中的编程哲学

抽象的艺术:Go 语言中的编程哲学

时间:2024-03-27 22:56:30浏览次数:29  
标签:winningTeam string 编程 抽象 scores Go currentWinner

抽象的艺术:Go 语言中的编程哲学

原创 TimLiu 爱发白日梦的后端 2024-03-25 07:00 广东 1人听过

 

爱发白日梦的后端 专注 Go 语言领域的发展,学习成为更牛逼的架构师,日常分享 Go 语言、架构、软件工具的使用。 179篇原创内容 公众号

点击上方“名片”,关注公众号,加群可获得我整理的海量资料

在编程的世界里,抽象是一种艺术,它不仅仅是隐藏实现细节的技巧,更是一种提升代码质量和理解性的哲学。让我们一起探索抽象的深层含义,并看看如何在 Go 语言中实践这一概念。

抽象:不只是隐藏

抽象是编程中的一个重要概念,它帮助我们隐藏数据的背景细节,只展示用户所需的信息。然而,抽象的意义远不止于此。正如 Dijkstra 所说:

抽象的目的不是为了含糊不清,而是为了创造一个新的语义层次,在这个层次上,人们可以做到绝对精确。

这个新的语义层次,就是抽象的真正魅力所在。它让我们能够用更少的词汇,更精确地描述复杂的事物。

抽象的实践:Go 语言的例子

让我们通过一个简单的例子来理解抽象的力量。假设我们有三支队伍——猫队、狗队和海狸队——它们在进行比赛。每场比赛的获胜队伍可以获得 3 分,最终得分最高的队伍将成为赢家。

下面的代码实现了一个简单的比赛获胜者计算器:

package main

import "fmt"

func main() {
    competitions := [][]string{
       {"Cats", "Dogs"},
       {"Dogs", "Beavers"},
       {"Beavers", "Cats"},
    }
    results := []int{0, 0, 1}
    fmt.Println(TournamentWinner(competitions, results)) // 输出获胜者
}

func TournamentWinner(competitions [][]string, results []int) string {
    var currentWinner string
    scores := make(map[string]int)

    for _, competition := range competitions {
        homeTeam, awayTeam := competition[0], competition[1]
        if results[0] == 1 {
            scores[homeTeam] += 3
            if scores[homeTeam] > scores[currentWinner] {
                currentWinner = homeTeam
            }
        }
        // ... 其他比赛逻辑
    }

    return currentWinner
}

这段代码虽然能够工作,但它的逻辑并不清晰。我们需要的是一个更高层次的抽象,能够让我们清楚地表达比赛的逻辑。

提升抽象层次

为了提升代码的抽象层次,我们可以引入一个新的函数 getWinner,它负责从比赛结果中提取获胜队伍,并更新得分:

func getWinner(competition []string, result int) string {
    homeTeam, awayTeam := competition[0], competition[1]
    winningTeam := awayTeam
    if result == 1 {
        winningTeam = homeTeam
    }
    return winningTeam
}

func TournamentWinner(competitions [][]string, results []int) string {
    var currentWinner string
    scores := make(map[string]int)

    for _, competition := range competitions {
        winningTeam := getWinner(competition, results[0])
        currentWinner = updateWinner(winningTeam, scores, currentWinner)
    }

    return currentWinner
}

func updateWinner(winningTeam string, scores map[string]int, currentWinner string) string {
    scores[winningTeam] += 3
    if scores[winningTeam] > scores[currentWinner] {
        currentWinner = winningTeam
    }
    return currentWinner
}

通过这样的抽象,我们的代码变得更加清晰和易于理解。每个函数都有一个明确的目的,整个程序的逻辑也更加直观。

结语

抽象是编程中的一种强大工具,它不仅能够帮助我们简化代码,还能够提升我们的思考层次。在 Go 语言中,通过合理的抽象,我们可以编写出既简洁又富有表现力的代码。记住,抽象的艺术在于找到适当的平衡点,既不过于复杂,也不过于简化。让我们一起在编程的道路上,追求更高的抽象层次吧!

如果你也认可,请为它点赞。

也欢迎大家加入我创建技术交流群,交个朋友~

在交流群里,有问题可以咨询我哈,我也会分享技术、搞钱等信息,一起加油~

图片

TimLiu

赞赏二维码喜欢作者

go127 阅读 422 爱发白日梦的后端 ​ 分享此内容的人还喜欢   软件架构的23个基本原则     我看过的号 DeepNoMind 不看的原因   深入理解Go语言中的map:结构、性能与最佳实践     海天二路搬砖工 不看的原因   更强大的Go执行跟踪能力     我看过的号 鸟窝聊技术 不看的原因       复制投诉      

人划线

标签:winningTeam,string,编程,抽象,scores,Go,currentWinner
From: https://www.cnblogs.com/cheyunhua/p/18100508

相关文章

  • 泛型编程之模板
    1.函数模板重要行:template<typenameT,typenameT1>关键值class和typename含义相同,那么我们以后就使用typename即可。 一般情况下的格式:template<模板参数列表>返回值类型函数名(函数参数) 模板参数列表的理解:函数参数列表在运行时调用者用实参来初始化形参而......
  • 抽象类java
    packagedemo;abstractclassPerson{//私有数据成员privateStringname;publicPerson(){}publicPerson(Stringname){this.name=name;}//getter和setter方法publicStringgetName(){returnname;}......
  • 小猴编程周赛C++ | 最小能力差
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】某校信竞社团有nnn......
  • 小猴编程周赛C++ | 卡牌顺序
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】小猴有nnn卡牌,编号......
  • 网络编程之流式套接字
    流式套接字(SOCK_STREAM)是一种网络编程接口,它提供了一种面向连接的、可靠的、无差错和无重复的数据传输服务。这种服务保证了数据按照发送的顺序被接收,使得数据传输具有高度的稳定性和正确性。通常用于那些对数据的顺序和完整性有严格要求的应用。通常由传输控制协议(TCP)来实现。......
  • 2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n
    2024-03-27:用go语言,多维费用背包。给你一个二进制字符串数组strs和两个整数m和n,请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。输入:strs=["10","0001","111001","1","0"],m=......
  • 推荐 10 个非常有用的 Golang Libraries
    推荐10个非常有用的GolangLibraries原创 GoOfficialBlog GoOfficialBlog 2024-03-2518:16 山东 听全文Go语言的标准库非常好用。通常情况下,你不需要任何额外的库来完成任务。但是在某些情况下,可能需要使用一些库。今天将与你分享日常工作中很有用的10个......
  • 13DOM编程API(一)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Do......
  • 15DOM编程API(三)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • 14DOM编程API(二)
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......