1.1 golang中的init函数和main函数

  1、init函数和main函数

      1. golang里面有两个保留的函数:init函数(用于所有package)main函数(只能用于package main)。(这两个函数在定义时不能有任何的参数和返回值)

      2. 每个package中的init函数都是可选的,但package main就必须包含一个main函数。

      3. go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。

      4. 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。

      5. 等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。

  2、调用过程

      

  3、在main package中调用add package中变量和方法

    1. 直接使用默认包名调用add中方法

package main

import (
"LearGoProject/day1/example3/add" // 下面可以直接使用package名字 add 调用变量和方法
"fmt"
) func main() {
add.Test() // 调用add.go中的Test()方法就会修改Name、和Age的值
fmt.Println(add.Name) // 打印add中的变量Name :hello go
fmt.Println(add.Age) // 打印add中的变量Age :100
}

example3\main\main.go

package add

var Name string = "hello world"   // 变量名为大写才不是私有的,可以在main.go中访问
var Age int = 10 func Test() {
Name = "hello go"
Age = 100
}

example3\add\add.go

    2. 通过包别名调用 addd package中变量和方法

package main

import (
aa "LearGoProject/day1/example3/add" // 将add这个文件取一个别名 aa 下面调用add.go中方法就是用aa
"fmt"
) func main() {
aa.Test() // 通过package别名aa来调用add package中方法
fmt.Println(aa.Name) // 打印add中的变量Name :hello go
fmt.Println(aa.Age) // 打印add中的变量Age :100
}

example3\main\main.go

package add

var Name string = "hello world"   // 变量名为大写才不是私有的,可以在main.go中访问
var Age int = 10 func Test() {
Name = "hello go"
Age = 100
}

example3\add\add.go

    3. 通过init方法自动调用

package main

import (
aa "LearGoProject/day1/example3/add" // 将add这个文件取一个别名 aa 下面调用add.go中方法就是用aa
"fmt"
) func main() {
//aa.Test() // 这里add中修改变量的方法写在init中所以会自动调用
fmt.Println(aa.Name) // 打印add中的变量Name :hello go
fmt.Println(aa.Age) // 打印add中的变量Age :100
}

example3\main\main.go

package add

var Name string = "hello world"   // 变量名为大写才不是私有的,可以在main.go中访问
var Age int = 10 // 每个源文件可以包含一个init函数,这个init函数自动被go运行的框架调用
func init() {
Name = "hello go"
Age = 100
}

example3\add\add.go

1.2 程序结构

   1、声明  

      1. Go语言主要有四种类型的声明:var(变量)、const(常量)、type(类型)和func(函数)。

      2. 在包一级声明语句声明的名字可在整个包对应的每个源文件中访问,而不是仅仅在其声明语句所在的源文件中访问

      3. 在函数内的声明只能在函数内访问。

  2、变量

    1)var 变量名字 类型 = 表达式 

package main
import "fmt" var a int = 9
var str string ="I Am String" func main() {
fmt.Println(a)
fmt.Println(str)
}

var关键字变量

    2)简短变量声明

        1. 请记住“:=”是一个变量声明语句,而“=‘是一个变量赋值操作。

        2. := 是声明并赋值,并且系统自动推断类型,不需要var关键字

package main
import "fmt" func main() {
i := 100 // an int
fmt.Println(i)
}

简短变量声明

  3、指针

    1)指针介绍

        1. 一个变量对应一个保存了变量对应类型值的内存空间,普通变量在声明语句创建时被绑定到一个变量名,比如叫x的变量

        2. 但是还有很多变量始终以表达式方式引入,例如x[i]或x.f变量。

        3. 一个指针的值是另一个变量的地址,一个指针对应变量在内存中的存储位置

        4. 并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。

        5. 通过指针,我们可以直接读或更新对应变量的值,而不需要知道该变量的名字(如果变量有名字的话)。

    2)指针举例

package main
import "fmt" func main() {
x := 1 // 什么一个x变量
p := &x // &x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针p
fmt.Println(*p) // "1" *p 表达式对应p指针指向的变量的值
*p = 2 // *p = 2 等价于 x = 2 表示更新指针所指向的变量的值。
fmt.Println(x) // "2" 此时再打印x已经是*p更新过的结果2
} /*
如果用“var x int”声明语句声明一个x变量,
那么&x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针
指针对应的数据类型是 *int ,指针被称之为“指向int类型的指针”
如果指针名字为p,那么可以说“p指针指向变量x”,或者说“p指针保存了x变量的内存地址”。
同时 *p 表达式对应p指针指向的变量的值。
一般 *p 表达式读取指针指向的变量的值,这里为int类型的值,同时因为 *p 对应一个变量
所以该表达式也可以出现在赋值语句的左边,表示更新指针所指向的变量的值。
*/

举例理解指针

  4、new函数

      1. 表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T

      2. 用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(T)

func newInt() *int {
return new(int)
} func newInt() *int {
var dummy int
return &dummy
}

这两个newInt函数有着相同的行为

11111111111111111

02:golang基础的更多相关文章

  1. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  2. golang基础知识之encoding/json package

    golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...

  3. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  4. GoLang基础数据类型--->字典(map)详解

    GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...

  5. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  6. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  7. GoLang基础数据类型--->字符串处理大全

    GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:   高级运维工程师之路               59843264 ...

  8. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

  9. 如何使用gitlab自建golang基础库

    这里以go mod方式建立golang基础库 一.gitlab创建项目golib 地址为gitlab.xxx.com/base/golib 示例如下 go mod初始化命令 go mod init g ...

  10. 数据分析02 /pandas基础

    数据分析02 /pandas基础 目录 数据分析02 /pandas基础 1. pandas简介 2. Series 3. DataFrame 4. 总结: 1. pandas简介 numpy能够帮助 ...

随机推荐

  1. iOS WebView中视频横屏播放返回导航栏在状态栏下面

    iOS9以上系统横屏播放UIWebView中的视频返回后会出现以下问题:1.如图,UIWebView中包含一个视频:   1 2.播放web内容中的视频,并横屏观看:   2 3.直接在横屏状态下返回 ...

  2. Solve Error: nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)

    Error: nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)&quo ...

  3. react 简单的用函数调出ui显示

    import test from '../components/test' const info = () => { test.info('This is a normal message'); ...

  4. PHP base64数据与图片的互相转换

    1.解析base64数据成图片 The problem is that data:image/bmp;base64, is included in the encoded contents. This ...

  5. 用 ArrayList 集合调用商品类

    public class  Commodity{ //定义商品类 String name; //定义商品名字 double  size;  //定义商品尺寸 double  price; //定义商品 ...

  6. 自己配置 vue 项目 知识体系(自己写脚手架 类似 vue-cli )

    简单的目录结构: |-index.html |-main.js 入口文件 |-App.vue vue文件,官方推荐命名法 |-package.json 工程文件(项目依赖.名称.配置) npm ini ...

  7. django form 组件插件

    创建类: class RegForms(forms.Form): account = fields.CharField( required = True, #必填字段 max_length=12, m ...

  8. Broadcast

    静态注册广播接收器 1. 活动中创建内部类继承BroadcastReceiver实现 onReceive函数 2. new 一个内部类的对象 3. registerReceiver注册内部类 4. 在 ...

  9. python语法_算数运算+赋值运算符+比较运算符+逻辑运算符

    算术运算符 + - * /  加减乘除 5/2 = 2.5 5//2 = 2  整除,地板除 5%2= 1 取余数 2**10 指数运算 2的10次方 算术优先级 无论多少级,都使用()小括号进行优先 ...

  10. laravel发布订阅

    1.php artisan make:command RedisSubscribe 在app console中会生成RedisSubscribe.php文件 <?php namespace Ap ...