6016ebf9bf14c877fd8a07972aa41423
go实战-包、结构体struct套路学习

今天我们来学习go语言的包引用和结构体,如果你使用过 python的package,它一般是这样的引用方式,

from lib.ssh_process import SSHProcess

如果你使用过 java,java里面有package,引入包经常会这样

package com.dev;
import org.apache.xxx.xxx;
import com.longmore.xx.xx;

包最直观的的作用就是协调和组织我们的代码,方便归类和复用,提高代码的可维护性,go里面也有,但是要注意的是,go程序要有main包,main函数作为入口,同包内不需要import,同一个文件夹 不能出现不同的package包名,所以一般和文件夹同名,方便维护,不同的 包下 想调用方法,方法首字母要大写。

废话不多说,我们来举个例子

练习

一个程序包含两个包add和main,其中add包中有两个变量:Name和age。请问main包中如何访问Name和age?
设置gopath:

export GOPATH="/Users/longmore/workspace/go/dev:/Users/longmore/go"
cd /Users/longmore/workspace/go/dev/src/project/example1

main.go
path:src/project/example1/main/main.go

package main
import(
    a "project/example1/add"
    "fmt"
)
func main() {    
    fmt.Println("Name=", a.Name)
    fmt.Println("age=", a.Age)
}

add.go
path:src/project/example1/add/add.go

package add
import(
     _ "project/example1/test"
)
func init () {
    Name = "hello world"
    Age = 10
}
var Name string = "xxxxx"
var Age int = 100

test.go
path:src/project/example1/test/test.go

package test
import (
    "fmt"
)
var Name string = "this is in test package"
var Age int = 1000
func init() {
    fmt.Println("this is a test")
    fmt.Println("test.package.Name=", Name)
    fmt.Println("test.package.age=", Age)
    Age = 10
    fmt.Println("test.package.age=", Age)
}

让我们先运行看结果
go build main.go

this is a test
test.package.Name= this is in test package
test.package.age= 1000
test.package.age= 10
Name= hello world
age= 10

通过结果看逻辑,我们在main.go里面发现,import引入add包,是从gopath目录下的src开始,这是一个规定,project/example1是项目目录,add main test是代码包,他们都有自己的package,package main :main方法是入口,java里面也一样,如果是老司机看下代码应该明白。

值得注意的是:init方法
我们在main.go里面熟悉 import了add包,add里面先引用了test,但是前面加了_,表示不使用,test.go里面定义了init方法,所以会首先执行test的init,在执行add的init,add.go里面 ,init方法的花括号里面
Name Age 的作用域较小,所以值被覆盖。

结构体 struct

golang不像java或PHP,有class类等面向对象的概念。
一般可以使用 struct来 来实现
譬如
type User struct {
uid int
uname string
}
这好比有个 类叫做User,里面有两个属性uname和uage, 也没有public、protected、private修饰符,下面我们做个项目来了解下 struct
目录结构:

main.go
```golang
package main
import (
"fmt"

top Created with Sketch.