码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • go语言包管理和变量保护


    文章目录

      • 包、模块、工作空间
      • 变量保护

    go语言教程:

    • 安装入门➡️for循环➡️数组、切片和指针➡️switch和map
    • 函数进阶➡️结构体、接口、面向对象
    • 本文代码:go语言包管理测试代码

    包、模块、工作空间

    每个Go语言程序,都以package xxx开头,即申明本文件定义的所有函数、结构体,均从属于xxx包。当项目文件较多时,这种管理方式是所有编程语言的必然选择。相应地,通过import来调用包也是情理之中了,但低版本的Go语言很坑,并不支持import相对路径,故而本文对导入包的介绍,只在1.18以上的Go语言版本中有效。

    为了让案例足够简单,可按照如下目录结构创建相应的文件,其中hello.go文件设置了一个自定义函数,我们希望main.go文件对其进行引用

    demo
    │  go.work
    │
    ├─main
    │      go.mod
    │      main.go
    │
    └─tools
            go.mod
            hello.go
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中,go.work为工作空间文件,use是工作空间中用到的库,其作用可以理解为将相对路径添加到环境变量,从而让go语言引用。

    //go.work
    use (
    	./tools
    	./main
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    tools文件夹中有两个文件,hello.go就是一个简单的go包,内容如下,无需多言。

    //tools/hello.go
    package tools
    
    func Hello() string {
    	return "Hello world"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    go.mod则是一个模块文件,用以声明模块名,当其他文件引用hello.go中的函数时,需要用到这个名字。

    //tools/go.mod
    module microcold/tools
    
    • 1
    • 2

    main文件夹中的内容与tools如出一辙,go.mod和main.go文件分别如下

    //main/go.mod
    module microcold/main
    
    • 1
    • 2
    //main/main.go
    package main
    
    import (
    	"fmt"
    	"microcold/tools"
    )
    
    func main() {
    	fmt.Println(tools.Hello())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    最后在demo文件夹下运行go run指令,即可得到正确结果。

    >go run microcold/main
    Hello world
    
    • 1
    • 2

    变量保护

    所谓封装,并不仅仅是把一些变量和功能塞给一个类,关键还需要有变量保护。在Go语言中,结构体成员如果以大写字母开头,则允许包外访问,如果以小写字母开头,则不允许。

    比如,将hello.go中的Hello函数改为小写的hello,则编译时会报如下错误

    main\main.go:9:20: undefined: tools.Hello
    
    • 1

    结构体的命名同样遵循这个要求,下面在tools文件夹中新建一个note.go文件,内容为

    package tools
    
    type Note struct{
    	Title string
    	Author string
    	Pages int
    	Words int
    }
    
    func (n *Note) GetWordsPP() int {
        return n.Words / n.Pages
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    然后改写main函数

    // main.go。。。前面不用改
    
    func main(){
    	n := tools.Note{"GoLearning", "microCold", 200, 250000}
    	fmt.Println("标题:", n.Title)
    	fmt.Println("每页字数:", n.GetWordsPP())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果为

    >go run microcold/main
    标题: GoLearning
    每页字数: 1250
    
    • 1
    • 2
    • 3

    如果将Note结构体中的Author改为小写的author,尽管这个成员没有被显式地调用,但编译过程仍会报错

    >go run microcold/main
    # microcold/main
    main\main.go:9:32: implicit assignment to unexported field author in tools.Note literal
    
    • 1
    • 2
    • 3
  • 相关阅读:
    全志芯片Tina Linux 修改 UART 引脚、UART端口 (2)
    Flume启停脚本f1.sh
    REDIS三主三从集群搭建笔记(redis版本5.0.8)
    客快物流大数据项目(九十):ClickHouse的引擎介绍和深入日志引擎讲解
    基于php的校园活动之影像资料分享平台
    谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
    Python工程师Java之路(p)Maven聚合和继承
    Centos8.1安装Redis6.2.5
    大学生静态HTML网页源码 我的校园网页设计成品 学校班级网页制作模板 web课程设计 dreamweaver网页作业
    [附源码]java毕业设计学校缴费系统
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/133766128
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号