Go语言核心36讲

Go语言核心36讲

其它学习课程目录:

其它学习课程目录:

从0开始学微服务

面试官绝杀:系统是如何支撑高并发的?

分布式技术原理与算法解析

消息队列高手课

从0开始学架构

微服务架构实战160讲

网络编程实战

01 | 工作区和GOPATH

gopath指的是工作空间(包括源码,可以有多个)

构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且这些操作生成的任何文件都会先被保存到某个临时的目录中。

go install命令安装的是库源码文件时会产生归档文件,结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录

go install命令安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的bin 目录中,或者环境变量GOBIN指向的目录中。

go build可以没有命令源码文件,构建命令源码文件时候,生成的可执行文件文件名会与文件所在目录的名字一样

在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,

或者源码文件有了变化,那它还是会被编译。

当有多个文件时,go build必须一起构建

下载包命令 : go get

go get 虽然简单粗暴,但是缺点是不能进行版本控制

思考题

Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?

如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?

02 | 命令源码文件

1.源码文件分为三种:命令源码文件(有main方法)、库源码文件和测试源码文件

2.编写命令源码文件的关键包: flag。

代码

    package main

    import (
        "fmt"
        "flag"
    )

    var name  string

    func init()  {
        //函数flag.StringVar接受 4 个参数。第 1 个是接收命令参数值的地址,第二个是命令参数的名称
        //第三个是当命令参数没值时候的默认值   第四个是该命令参数的简单说明
        flag.StringVar(&name,"name","everyone","The greeting object.")
        //var name = flag.String("name", "everyone", "The greeting object.")
    }

    func main()  {
        //解析命令参数,并把它们的值赋给相应的变量。
        flag.Parse()
        fmt.Printf("hello,%s\n",name)
    }

运行结果


用help查看参数说明

图片第二行的路径是命令构建上述命令源码文件时临时生成的可执行文件的完整路径

思考题

默认情况下,我们可以让命令源码文件接受哪些类型的参数值?

我们可以把自定义的数据类型作为参数值的类型吗?如果可以,怎样做?

03 | 库源码文件

在同一目录下的源码文件  都必须声明属于同一个包(比如你在一个文件夹下创建了一个命令源码文件,该文件夹下其他的所有go文件都必须声明为main包)

源码文件声明的包名可以与其所在目录名称不同,但是同一目录下的源码文件 必须声明同样的包名

可以看到,当引用别的目录的源码文件时,导入的包路径为文件夹的名字(既other,该路径是相对于src的路径),而调用的时候却是通过包名来调用(other1)

注意

当需要运行上面代码时,只需要go run main.go

如果上图的main方法里调用的是yasuo包里的Hello()方法时,则需要go run 两个文件,如下图,否则就会报错

undefined: Hello

或者是>go build go36/day3/yasuo(src的相对路径)

原因是因为前面是引入了代码包,所有run的时候,可以通过路径找到对应的文件,然后编译构建运行,后面报错是因为找不到库源码文件,因为没指定(我猜的)

模块级私有internal的使用姿势

思考题

如果你需要导入两个代码包,而这两个代码包的导入路径的最后一级是相同的,比如:dep/lib/flag和flag,那么会产生冲突吗?

如果会产生冲突,那么怎样解决这种冲突,有几种方式?

1.import后路径最后一级相同,不一定会冲突。
分为两种情况:
a.如果文件夹下文件声明的包名相同,则肯定冲突,会报错redeclared。
b.如果文件夹下文件声明的包名不同,也不会冲突。

2.如果冲突,我能想到的解决方式:
a.给包设置别名,调用的时候来区分开不同的package,比如:import(b "bbbb")

b.导入的点操作,import(. "bbbb")。这样就可以直接调用bbbb下面的函数而不用再bbbb.funcname的方式调用。

c.如果只是想引入某包并没有在代码中实际调用则可以这么处理来避免冲突:import(_ "bbbb")

d.采取不同的包名声明

04 | 程序实体的那些事儿(上)

var name = 1

name := 1(短变量声明)

短变量声明只能在函数体内部使用短变量声明。

05 | 程序实体的那些事儿(中)

如果我们把代码包导入语句写成import . XXX的形式(注意有个.),那么就会让这个“XXX”包中公开的程序实体被当前源码文件中的代码,视为当前代码包中的程序实体

变量重声明是对同一个变量的多次声明,这里的变量只有一个。而可重名变量中涉及的变量肯定是有多个的。

不论对变量重声明多少次,其类型必须始终一致,具体遵从它第一次被声明时给定的类型。而可重名变量之间不存在类似的限制,它们的类型可以是任意的。

如果可重名变量所在的代码块之间存在直接或间接的嵌套关系,那么它们之间一定会存在“屏蔽”的现象。但是这种现象绝对不会在变量重声明的场景下出现。

原文地址:https://www.cnblogs.com/it-chen/p/11638524.html

时间: 2024-08-17 05:12:55

Go语言核心36讲的相关文章

cocos-html5 JS 写法基础 语言核心

转载:http://blog.csdn.net/leasystu/article/details/18735797 cocos2dx 3.0 js继承:John Resiq的继承写法解析 CCClass.js cocos2d-html5/cocos2d/core/platform/CCClass.js ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

JS学习第二天----JS语言核心

JS语言核心 有些东西,对于初学者来说,可能看不懂,我在这里只是想说一下,JS里面有这么个情况,并不是说让你掌握,你只需要大致浏览一下就可以了. // 所有在双斜杠之后的内容都属于注释 //变量是表示值的一个符号名字 //变量通过var关键字来声明,案例: var x;//声明一个变量x //值可以通过等号赋值给变量 x=0;  //现在变量x的值为0 x //=>0:通过变量获取其值 //JS支持多种数据类型 x=1; //数字 x=0.01; //整数和实数公用一种数据类型 x="he

JS 语言核心(JavaScript权威指南第六版)(阅读笔记)

前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思想需要细心和大量实践才能慢慢参悟,在这之前需要做的是能够运用它来开发,那么了解一些基础特性非常有必要,通常这些特性是需要经验积累,从各种坑中累计出来,但是还有一种看似很笨却很有效的学习方法.那就是将别人的经验记录下来,有事没事都拿出来看看,集合开发中的经验,这会非常有效. 调试工具 firebug

最新硅谷产品实战36讲

课程目录 开篇词 | 打造千万用户的世界级产品 01 | 什么是优秀的产品经理? 02 | 硅谷的产品经理是什么样子的? 03 | 科技巨头和初创公司的产品经理有什么不同? 04 | 产品经理和项目经理有什么区别? 05 | 硅谷产品经理每天在做什么? 06 | 硅谷产品经理们都来自什么背景? 07 | 如何寻找用户需求? 08 | 目标客户和用户画像 09 | 手把手教你写用例: 优化微信加好友的功能 10 | 什么是最小化可行产品(MVP)? 11 | 案例:产品发布之前出了乱子,如何权衡取

java核心技术-(总结自杨晓峰-java核心技术36讲)

1. 谈谈你对java平台的理解 首先是java最显著的两个特性,一次写入处处运行:还有垃圾收集器gc,gc能够对java内存进行管理回收,程序员不需要关心内存的分配和回收问题 然后谈谈jre和jdk的区别,jre包含了jvm和java类库:jdk除了jvm和java类库,还包含了一些java工具集 常见的垃圾收集器有: Serial GC:串行收集,垃圾回收时会阻塞工作线程 Parallel GC:并行收集,多线程收集,停顿时间短,吞吐量高 CMS:使用标记清除算法,多线程进行垃圾收集 G1:

第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种数据库自身体系结构的理解.今天这一讲,作为补充 Java 面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习.今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?典型回答所谓隔离级别(Isolation Level),就是在数据库事务中,

2.C#1语言核心基础

C#1语言核心基础 本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托.类型系统.值/引用类型 1.委托 委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托. 简单委托的构成 要执行一个委托必须满足一下4个条件 申明委托类型 创建一个方法包含要执行的代码 创建一个委托实例 调用委托实例 合并和删除委托 上面的例子委托实例都只是一个操作,但是真实情况要稍微复杂一些,委托实例实际有一个操作列表与之关联,这就是调用列表. System.

C语言第四讲,typedef 关键字,以及作用域

C语言第四讲,typedef 关键字,以及作用域 一丶typedef关键字 在C语言中,有typedef 关键字,这个关键字的作用就是允许你为类型定义一个新的名字,也就是 起个别的名字 例如: typedef unsigned int DWORD 那么以后,我们定义unsigned int 类型的变量的时候,这不用敲写 unsigned int 了.直接DWORD即可. 例如: DWORD name = 0; 一般常常用在 结构体的定义,和函数指针上. 例如: typedef struct My

C语言第八讲,指针*

C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 int nNum1 = 1; int nNum2 = 0x00401000; 变量nNum1 保存的值是1 变量nNum2 保存的是一个16进制数值. 那么如果我们把保存16进制的这个变量.当作指针. 也就是说它保存了一个16进制数值而已. 我们可以通过16进制找到里面存储的值. 但是因为是保存地