[瞎写个 golang 脚本]01-项目搭建

347 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

前言

学习了 2 次 Golang,基本都是把基础语言都学了一遍,之后就又荒废了。今天就随意使用 Golang 写个脚本项目。

需求内容

1、通过 key 和 secret 获取 accessToken 2、使用 token 从第三方接口获取数据信息的,第三方接口的数据有 4 万多条,然而没有使用分页形式返回数据,那么只能是循环,然后判断数据量进行获取所有的信息 3、将获取到数据进行转成 sql ,insert 到本地的 db 数据中

项目结构

将项目工程化,搭建一个 baseCode 的项目

.
├── cmd
│   └── yxx-app
├── config
├── internal
│   ├── repo
│   ├── service
│   ├── pkg
│   └── utilies
│    
└── pkg
  • /cmd 项目主干目录,主要放置 main.go ,负责项目的主要入口

  • /internal 项目所需其他内容,不允许被其他项目导入使用

    • 再划分,业务逻辑 service层,数据访问层 repo,公共部分 ,其他模块pkg
  • /pkg 放置一些可以被外部程序安全导入的包,比如 缓存,mq等一些公共内容

  • /config 配置文件或者默认模版

遇到问题

  1. 创建的 struct 为什么无法在main 中引入

Golang 中没有 private、protected 、public 等访问控制修饰符,但可以通过字母大小写来控制权限,大写开头则能被其他包访问或者调用,小写开头只能在包内使用

type UserService struct { // 首字母大写 类似 public 
  name string
}
​
type roleService struct { // 小写的类似 private 
  name string 
}

2、结构体绑定函数和结构体指针绑定函数

type UserService struct {
  name string
}
​
// 给结构体指针绑定函数
func (userService *UserService) createUser(user UserModel) {
    ......
}
​
// 给结构体绑定函数
func (userService UserService) updateUser(user UserModel) {
    ......
}
​
// 使用时的区别
func main() {
  user := &UserService{ "小明"}
  user.updateUser(model)
  
  var user UserService
  user.createUser(model)
}

对结构体绑定函数时,需要对 UserService 进行复制,创建一个新的结构体,然后对新的结构体操作,不影响原来结构体的值

对结构体指针绑定函数,其实就是通过指针地址使用原结构体,所以如果操作都会改变原结构体

所以,该绑定在哪里,尽量绑定在结构体指针上,避免不必要的内存拷贝,但是如果遇到业务场景,不期望修改原有的结构体的值时,可以绑定到结构体上。