不灭的火

革命尚未成功,同志仍须努力:加密SHA/AES/RSA下载JDK17

作者:AlbertWen  添加时间:2017-10-29 09:14:50  修改时间:2025-09-09 03:37:22  分类:02.Golang编程  编辑

上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的。

反射中调用 函数

众所周知,Golang 中的函数是可以像普通的 int、float 等类型变量那样作为值的,例如:

package main

import "fmt"

func hello() {
	fmt.Println("Hello world!")
}

func main() {
	hl := hello
	hl()
}

prints:

hello world!

既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量是一样的,在反射中 函数 和 方法 的类型(Type)都是 reflect.Func,如果要调用函数的话,可以通过 Value 的 Call() 方法,例如:

func main() {
	hl := hello
	fv := reflect.ValueOf(hl)
	fmt.Println("fv is reflect.Func ?", fv.Kind() == reflect.Func)
	fv.Call(nil)
}

prints:

fv is reflect.Func? true
hello world!

Value 的 Call() 方法的参数是一个 Value 的 slice,对应的反射函数类型的参数,返回值也是一个 Value 的 slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了:

func prints(i int) string {
	fmt.Println("i =", i)
	return strconv.Itoa(i)
}

func main() {
	fv := reflect.ValueOf(prints)
	params := make([]reflect.Value, 1)                 // 参数
	params[0] = reflect.ValueOf(20)                    // 参数设置为20
	rs := fv.Call(params)                              // rs作为结果接受函数的返回值
	fmt.Println("result:", rs[0].Interface().(string)) // 当然也可以直接是 rs[0].Interface()
}

prints:

i = 20
result: 20
作者:AlbertWen  添加时间:2017-10-29 10:23:09  修改时间:2025-09-09 02:20:11  分类:02.Golang编程  编辑
作者:AlbertWen  添加时间:2017-11-01 14:44:31  修改时间:2025-09-18 04:07:55  分类:02.Golang编程  编辑

有时候 go get 比较慢,可以考虑用迅雷等下载工具下载下来,然后再本地安装,

如:code.google.com/p/go.net/websocket,如何安装这些离线包?

先在你的 GOPATH 目录(如果不懂 GOPATH,请先弄懂)下,创建目录 src

mkdir sr
作者:AlbertWen  添加时间:2017-10-29 09:51:18  修改时间:2025-09-16 04:59:27  分类:02.Golang编程  编辑

Go 精简(合并)了流控制语句,虽然某些时候不够便捷,但够用。

if...else...

条件表达式值必须是布尔类型,可省略括号,且左花括号不能另起一行。

作者:AlbertWen  添加时间:2017-10-29 20:39:37  修改时间:2025-09-09 06:21:01  分类:02.Golang编程  编辑

用 glide 下载 goim 的依赖包时报错,提示: 

code.google.com/p/log4go 找不到,即下载失败

作者:AlbertWen  添加时间:2017-10-29 20:46:08  修改时间:2025-09-17 20:53:20  分类:02.Golang编程  编辑

Go 的基本类型共有 18 个,其中 int 和 uint 的实际宽度会根据计算架构的不同而不同。在 386 计算架构下,它的宽度为 32 比特,即 4 字节。在 amd64 (有时也称为 x86-64)计算架构下,它们的宽度为 64 比特。即 8 字节。

byte 可以看作类型 uint8 的别名类型,而 rune 可以看作 int32 的别名类型。rune 类型专用于存储 Unicode 编码的 单个字符

作者:AlbertWen  添加时间:2017-11-22 14:05:04  修改时间:2025-09-18 04:03:09  分类:02.Golang编程  编辑

概述

Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope K-V Store。但是对于新手来说,Context 的概念不算非常的直观,这篇文章来带领大家了解一下 Context 包的基本作用和使用方法。

1. 包的引入

在 go1.7 及以上版本 context 包被正式列入官方库中,所以我们只需要import "context"就可以了,而在 go1.6 及以下版本,我们要 import "golang.org/x/net/context"

作者:AlbertWen  添加时间:2017-10-29 10:18:56  修改时间:2025-09-16 20:57:57  分类:02.Golang编程  编辑

cgo 也是一个 Go 语言自带的特殊工具。一般情况下,我们使用命令 go tool cgo 来运行它。这个工具可以使我们创建能够调用 C 语言代码的 Go 语言源码文件。这使得我们可以使用 Go 语言代码去封装一些 C 语言的代码库,并提供给 Go 语言代码或项目使用。

作者:AlbertWen  添加时间:2017-10-29 09:53:17  修改时间:2025-09-15 22:49:05  分类:02.Golang编程  编辑

Golang 的 Cookie

web 开发免不了要和 cookie 打交道。Go 的 http 库也提供了 cookie 的相关操作。

type Cookie struct {
  Name       string
  Value      string
  Path       string
  Domain     string
  Expires    time.Time
  RawExpires string
  MaxAge     int
  Secure     bool
  HttpOnly   bool
  Raw        string
  Unparsed   []string
}

Name 字段为 cookie 的名字,Value 是其值,剩下的 Path 和 Domain 则是 cookie 的存储的范围。Expires 是 cookie 的过期时间,如果不设置,那么这是一个 session 型的 cookie,即浏览器会话有用,一旦关闭浏览器,cookie 随即会被删除。

作者:AlbertWen  添加时间:2017-10-29 20:56:39  修改时间:2025-09-17 08:39:40  分类:02.Golang编程  编辑
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的名字为: 张三