不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2017-08-25 21:06  分类:Go基础 

Java 中的集合(set)去重很方便,PHP 中的数组值去重,就更加方便,一个函数搞定:array_unique(),Golang 中就比较苦逼了,官方没有提供对“切片去重”的功能,而项目中,又经常用到这个功能,,我们可以模拟 Java 集合的功能,实现 Golang 版集合的同时,顺便把 去重 和 排序 做了,它的主要实现原理是:利用 map 数据 不允许键重名 的特点,参考代码如下:

作者:php-note.com  发布于:2017-08-25 16:09  分类:Go基础 

Go里面有很多方式返回一个struct的值或者slice,我们经常会看到的是如下的代码:

type MyStruct struct {
    Val int
}

func myfunc() MyStruct {
    return MyStruct{Val: 1}
}

func myfunc() *MyStruct {
    return &MyStruct{}
}

func myfunc(s *MyStruct) {
    s.Val = 1
}
作者:php-note.com  发布于:2017-08-15 21:06  分类:Go基础 

interface简介

Go 语言以简单易上手而著称,它的语法非常简单,熟悉 C++,Java 的开发者只需要很短的时间就可以掌握 Go 语言的基本用法。

interface 是 Go 语言里所提供的非常重要的特性。一个 interface 里可以定义一个或者多个函数,例如系统自带的 io.ReadWriter 的定义如下所示:

type ReadWriter interface {
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
}

任何类型只要它提供了 Read 和 Write 的绑定函数实现,Go 就认为这个类型实现了这个 interface(duck-type),而不像 Java 需要开发者使用 implements 标明。

作者:php-note.com  发布于:2017-08-14 21:04  分类:Go基础 

golang 的 nil 在概念上和其它语言的 null、None、nil、NULL一样,都指代零值或空值。nil 是预先说明的标识符,也即通常意义上的关键字。在 golang 中,nil 只能赋值给 指针channelfuncinterfacemapslice 类型的变量。如果未遵循这个规则,则会引发 panic。对此官方有明确的说明:http://pkg.golang.org/pkg/builtin/#Type

作者:php-note.com  发布于:2017-08-14 21:00  分类:Go基础 

nil是什么

相信写过Golang的程序员对下面一段代码是非常非常熟悉的了:

if err != nil {
    // do something....
}

当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil说明运行正常。那什么是nil呢?查一下词典可以知道,nil的意思是无,或者是零值。零值,zero value,是不是有点熟悉?在Go语言中,如果你声明了一个变量但是没有对它进行赋值操作,那么这个变量就会有一个类型的默认零值。

作者:php-note.com  发布于:2017-08-13 21:00  分类:Go基础 

注意:这些“坑”不是bug,只是自己当时没搞明白。

用到的框架为 Beego

1、字典 map 是“引用类型”,本身就是指针,作为参数传递时,直接传 map 变量名即可(不要传 map 变量指针)。

在调用方法内,如果修改了 map 变量值,外部的 map 变量值也会被改变的!

作者:php-note.com  发布于:2017-08-09 20:57  分类:Go基础 
import (
     "unicode"
)

func Ucfirst(str string) string {
    for i, v := range str {
        return string(unicode.ToUpper(v)) + str[i+1:]
    }
    return ""
}

func Lcfirst(str string) string {
    for i, v := range str {
        return string(unicode.ToLower(v)) + str[i+1:]
    }
    return ""
}

 

作者:php-note.com  发布于:2017-08-07 20:57  分类:Go基础 
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
)

// 官网的例子:http://golang.org/pkg/crypto/md5/
func main() {
	str := "123456" // 需要加密的字符串

	h := md5.New()
	io.WriteString(h, str)
	fmt.Printf("%x\n", h.Sum(nil)) // 输出加密结果

	c := md5.New()
	c.Write([]byte(str))
	fmt.Printf("%s\n", hex.EncodeToString(c.Sum(nil))) // 输出加密结果(项目中,用这个)
}

 

作者:php-note.com  发布于:2017-08-04 20:56  分类:Go基础 
package main

import (
    "fmt"
)

type A struct {
    Text string
    Name string
}

func (a *A) Say() {
    fmt.Printf("A::Say():%s\n", a.Text)
}

type B struct {
    A
    Name string
}

func (b *B) Say() {
    b.A.Say()
    fmt.Printf("B::Say():%s\n", b.Text)
}

func main() {
    b := B{A{"hello, world", "张三"}, "李四"}

    b.Say()
    fmt.Println("b的名字为:", b.Name)

    // 如果要显示 B 的 Name 值
    fmt.Println("b的名字为:", b.A.Name)
}

输出:

A::Say():hello, world
B::Say():hello, world
b的名字为: 李四
b的名字为: 张三
作者:php-note.com  发布于:2017-07-25 20:54  分类:Go基础 
package main

import "fmt"

// 用户
type User struct {
	Id   int
	Name string
	Age  int
}

func main() {
	user := User{Id:2, Name:"golang"}

	// 打印 结构体
	fmt.Printf("%+v", user)

	// 输出换行符
	fmt.Printf("\n")

	// 判断实例是否为空
	fmt.Println(user == User{})
}

输出:

{Id:2 Name:golang Age:0}
false