Go 语言中 var , := , new() 与 make() 的区别

此处的内容是为那些感兴趣的同学准备的,开发过程中知道用那个就可以了。

目录

var     变量声明多用于全局变量

:=     简短声明多用于局部变量

new()   分配内存函数,返回内存地址

make()   分配内存函数,仅用于 chan、map 和 slice,返回的数据类型就是这三个类型本身。

用法总结:


var     变量声明多用于全局变量

var name type :   
定义一个 type 类型的变量 name, 并分配内存空间给 name 赋 type 类型的零值。

var name *type :   
定义一个 type 类型的指针变量 name, 指针变量不分配内存空间,零值为 nil。

:=     简短声明多用于局部变量

i := 5
声明一个 int 型变量 i,分配内存空间并赋值。

i := 5.5
声明一个 float64 型变量 i,分配内存空间并赋值。

i := false
声明一个 bool 型变量 i,分配内存空间并赋值。

i := “Golang”
声明一个 string 型变量 i,分配内存空间并赋值。

       type dog struct {
           name string
           age  int
       }
i := dog{"xiao", 5}            i := dog{name: "xiao"}
声明一个 dog 型变量 i,分配内存空间并赋初值。

new()   分配内存函数,返回内存地址

var i *int
i = new(int)
or
i := new(int)
声明一个 int 型指针 i,分配一个 int 的内存空间,并把内存地址给 i。

make()   分配内存函数,仅用于 chan、map 和 slice,返回的数据类型就是这三个类型本身。

func make(t Type, size ...IntegerType) Type
chan、map 和 slice 这三种类型本身就是引用类型,所以没必要返回指针类型

用法总结:

凡遇到 chan、map 和 slice 就用make()
make(chan int, 1)
make(map[string]int, 5)
make([]string, 5)

其余情况用 := 或者 var 就能解决,可以不用 new()
i := 0
f := 0.0
b := false
str := ""
p := person{}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮我写代码文注释,并把写好注释的代码给我 package model import ( "database/sql/driver" "errors" "fmt" "math" "demo1/service/field/internal/pg" "encoding/json" "gorm.io/gorm" "gorm.io/gorm/schema" ) type Field struct { gorm.Model Uid uint gorm:"column:uid" json:"uid" Data JSONB gorm:"column:data" json:"data" } type JSONB json.RawMessage func (JSONB) GormDataType() string { return "jsonb" } func (JSONB) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "JSON" case "postgres": return "JSONB" } return "" } func (j JSONB) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return string(j), nil } func (j *JSONB) Scan(value interface{}) error { if value == nil { *j = JSONB("null") return nil } var bytes []byte switch v := value.(type) { case []byte: if len(v) > 0 { bytes = make([]byte, len(v)) copy(bytes, v) } case string: bytes = []byte(v) default: return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } result := json.RawMessage(bytes) *j = JSONB(result) return nil } func AddField(f *Field) error { if len(f.Data) == 0 { return errors.New("data is nil") } if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Create(&f).Error } func Fields() ([]*Field, error) { fs := make([]*Field, 0) err := pg.Client.Find(&fs).Error return fs, err } func FieldsUid(uid uint) ([]*Field, error) { if err := checkUid(uid); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Find(&fs, "uid = ?", uid).Error return fs, err } func FieldsLabel(label string) ([]*Field, error) { if err := checkLabel(label); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Raw("select * from fields where data -> '__config__' ->> 'label' = ?; ", label).Scan(&fs).Error if err != nil { return nil, err } return fs, nil } func UpdateField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } newF := new(Field) if err := pg.Client.First(newF, "uid = ?", f.Uid).Error; err != nil { return errors.New("uid Data dont exist") } newF.Data = f.Data return pg.Client.Save(newF).Error } func DeleteField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Delete(f, "uid = ?", f.Uid).Error } func checkUid(uid uint) error { if uid < 0 || uid > math.MaxUint32 { return errors.New("uid dont conform to the rules") } return nil } func checkLabel(la string) error { if la == "" { return errors.New("label cant be nil") } return nil }
07-15
以下是代码文注释的版本: ```go package model import ( "database/sql/driver" "encoding/json" "errors" "fmt" "math" "gorm.io/gorm" "gorm.io/gorm/schema" "demo1/service/field/internal/pg" ) type Field struct { gorm.Model Uid uint `gorm:"column:uid" json:"uid"` // 字段UID Data JSONB `gorm:"column:data" json:"data"` // 字段数据 } type JSONB json.RawMessage // GormDataType 返回字段类型的 GORM 数据类型 func (JSONB) GormDataType() string { return "jsonb" } // GormDBDataType 返回字段类型的 GORM 数据库数据类型 func (JSONB) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "JSON" case "postgres": return "JSONB" } return "" } // Value 将 JSONB 类型转换为 driver.Value func (j JSONB) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return string(j), nil } // Scan 将 value 转换为 JSONB 类型 func (j *JSONB) Scan(value interface{}) error { if value == nil { *j = JSONB("null") return nil } var bytes []byte switch v := value.(type) { case []byte: if len(v) > 0 { bytes = make([]byte, len(v)) copy(bytes, v) } case string: bytes = []byte(v) default: return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } result := json.RawMessage(bytes) *j = JSONB(result) return nil } // AddField 添加字段 func AddField(f *Field) error { if len(f.Data) == 0 { return errors.New("数据为空") } if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Create(&f).Error } // Fields 获取所有字段 func Fields() ([]*Field, error) { fs := make([]*Field, 0) err := pg.Client.Find(&fs).Error return fs, err } // FieldsUid 根据 UID 获取字段 func FieldsUid(uid uint) ([]*Field, error) { if err := checkUid(uid); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Find(&fs, "uid = ?", uid).Error return fs, err } // FieldsLabel 根据标签获取字段 func FieldsLabel(label string) ([]*Field, error) { if err := checkLabel(label); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Raw("select * from fields where data -> '__config__' ->> 'label' = ?; ", label).Scan(&fs).Error if err != nil { return nil, err } return fs, nil } // UpdateField 更新字段 func UpdateField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } newF := new(Field) if err := pg.Client.First(newF, "uid = ?", f.Uid).Error; err != nil { return errors.New("UID 对应的数据不存在") } newF.Data = f.Data return pg.Client.Save(newF).Error } // DeleteField 删除字段 func DeleteField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Delete(f, "uid = ?", f.Uid).Error } // checkUid 检查 UID 是否符合规则 func checkUid(uid uint) error { if uid < 0 || uid > math.MaxUint32 { return errors.New("UID 不符合规则") } return nil } // checkLabel 检查标签是否为空 func checkLabel(la string) error { if la == "" { return errors.New("标签不能为空") } return nil } ``` 希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值