我正在 VueJs、Typescript 和 WebPack 中开发一个 Web 应用程序,我对如何管理/拆分功能组(实用程序和服务)感到有些困惑。
我在 GitHub 的各种项目中看到一些函数是直接从文件 ex 中声明和导出的:
实用程序.ts
export function Sum(a:number, b:number):number{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
这可以与导入一起使用:
import {Sum} from "./utilities.ts"
let result = Sum(5,6);
Run Code Online (Sandbox Code Playgroud)
另一个常见的解决方案是声明一个 const 类:
otherUtilities.ts
export const OtherUtilities = {
Sum(a:number, b:number) : number => {
return a+b;
},
Hello() : string => {
return "Hello";
}
}
Run Code Online (Sandbox Code Playgroud)
并导入为:
import {OtherUtilities} from "./otherUtilities.ts"
let result = OtherUtilities.Sum(5,6);
Run Code Online (Sandbox Code Playgroud)
有什么区别?
过去,JS 存在名称冲突问题,但现在通过 Loaders 的导出/导入技术,这个问题应该已经过时了,对吧?
谢谢
我使用 DBeaver 在 PostgreSQL 中创建了一个函数。& 我正在尝试通过调用 DBeaver 中的函数将数据插入表中。但这给了我一个错误:
SQL错误[42883]:错误:函数public.proc_insert_test(整数,未知,未知,未知,未知,带时区的时间戳,整数,整数,整数,带时区的时间戳)不存在提示:没有函数与给定名称匹配和参数类型。您可能需要添加显式类型转换。位置:8
功能:
CREATE OR REPLACE FUNCTION public.proc_insert_test(
p_brndcode integer, p_brndname varchar(100), p_brndsname varchar(100),
p_prdtype char(1), p_discontinue char(1), p_crddate date,
p_status integer, p_recstat integer, p_brndgrpseqno integer,
p_wefrom date)
RETURNS char
LANGUAGE plpgsql
AS $body$
BEGIN
Insert into arc_mmstbrndgroup(brndcode, brndname, brndsname, prdtype, discontinue, crddate, status, recstat, brndgrpseqno, wefrom)
values(p_brndcode, p_brndname, p_brndsname, p_prdtype, p_discontinue, p_crddate, p_status, p_recstat, p_brndgrpseqno, p_wefrom);
END;
$body$
;
Run Code Online (Sandbox Code Playgroud)
调用函数:
select public.proc_insert_test(123, 'Test2', 'Test2', 'T', 'T', now(), 1, 9, 1234, now());
Run Code Online (Sandbox Code Playgroud)
可能是什么问题? …
Linuxsyscall.Mount函数需要一个文件系统类型。
如果您尝试使用文件系统运行它auto,如下所示:
func main(){
if err := syscall.Mount("/dev/sda1", "/mnt1", "auto", 0, "w"); err != nil {
log.Printf("Mount(\"%s\", \"%s\", \"auto\", 0, \"rw\")\n","/dev/sda1","/mnt1")
log.Fatal(err)
}
}
Run Code Online (Sandbox Code Playgroud)
它将失败no such device。这已经说明这里是Linux的syscall.Mount只是包装mount(2),其本身不支持“自动”文件系统类型的概念。
我知道如何使用 bash 找到它:
root@ubuntu:~/go/src# blkid /dev/sda1
/dev/sda1: UUID="527c895c-864e-4f4c-8fba-460754181173" TYPE="ext4" PARTUUID="db5c2e63-01"
Run Code Online (Sandbox Code Playgroud)
或者
root@ubuntu:~/go/src# file -sL /dev/sda1
/dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=527c895c-864e-4f4c-8fba-460754181173 (needs journal recovery) (extents) (large files) (huge files)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都会获得ext4文件系统类型。
更换auto用ext4 …
我正在使用 Go 的 Gin Web 框架创建一个端点。我的处理函数中需要完整的服务器 URL。例如,如果服务器正在运行http://localhost:8080并且我的端点是,那么当调用我的处理程序时/foo我需要。http://localhost:8080/foo
如果有人熟悉 Python 的快速 API,该对象有一个具有完全相同功能的Request方法:https: //stackoverflow.com/a/63682957/5353128url_for(<endpoint_name>)
在 Go 中,我尝试访问context.FullPath(),但只返回我的端点/foo,而不返回完整的 URL。除此之外,我在文档中找不到合适的方法:https://pkg.go.dev/github.com/gin-gonic/gin#Context
那么这可以通过gin.Context对象本身实现吗?还是还有其他方法?我对 Go 完全陌生。
让\xe2\x80\x99s 说我使用 aWaitGroup让应用程序的主线程等待,直到我从所述 main 启动的所有 goroutine 完成。
是否有一种安全、直接的方法可以在任何时间点评估有多少与 said 相关的 goroutineWaitGroup仍在运行?
我正在 go 1.18 的 beta 版本中使用泛型。下面示例中的创建函数应该创建*T(therefore *Apple) 的新实例。我尝试使用反射包来实现这一点,但没有运气。
您能否告诉我如何更改Create下面示例中的函数,以便它创建实例而T不是返回 nil 并使我的示例崩溃?
type FruitFactory[T any] struct{}
func (f FruitFactory[T]) Create() *T {
//how to create non-nil fruit here?
return nil
}
type Apple struct {
color string
}
func example() {
appleFactory := FruitFactory[Apple]{}
apple := appleFactory.Create()
//panics because nil pointer access
apple.color = "red"
}
Run Code Online (Sandbox Code Playgroud) 我尝试在 Go 中使用泛型,但我不太明白何时使用anyorcomparable作为类型参数。有人可以帮助理解这些吗?
在 Go 1.18 和 Go 1.19 中,我可以确保在编译时类型是严格可比较的,即它支持==和!=运算符,并且保证它们在运行时不会出现恐慌。
例如,这对于避免无意中向结构添加可能导致不必要的恐慌的字段很有用。
我只是尝试comparable用它实例化:
// supports == and != but comparison could panic at run time
type Foo struct {
SomeField any
}
func ensureComparable[T comparable]() {
// no-op
}
var _ = ensureComparable[Foo] // doesn't compile because Foo comparison may panic
Run Code Online (Sandbox Code Playgroud)
由于约束的定义,这在 Go 1.18 和 1.19 中是可能的comparable:
预先声明的接口类型可比较表示所有可比较的非接口类型的集合
尽管 Go 1.18 和 1.19 规范没有提及不是接口但也不能严格比较的类型,例如[2]fmt.Stringeror struct { foo any },gc …
例如,https : //github.com/golang/sys/blob/master/cpu/cpu_gccgo_x86.go#L5:
//go:build (386 || amd64 || amd64p32) && gccgo
// +build 386 amd64 amd64p32
// +build gccgo
package cpu
Run Code Online (Sandbox Code Playgroud)
在我看来,作为构建标签,// +build ... 可以很好地工作。
为什么//go:build仍然明确指定?
顺便说一句,很难找到 的手册//go:build,但// +build很容易(https://pkg.go.dev/cmd/go#hdr-Build_constraints)
在下面的代码中,我有一个包含文字值的标记类型。通过使用空接口,我可以创建一个令牌切片并附加具有不同类型的令牌。我认为使用泛型不可能完成相同的任务,因为我们无法推断令牌切片的类型。这个假设正确吗?
type Token struct {
TokenType string
Literal interface{}
}
func main(){
tok1 := &Token{TokenType: "string", Literal: "foo"}
tok2 := &Token{TokenType: "integer", Literal: 10}
tokS := []*Token{tok1, tok2}
}
Run Code Online (Sandbox Code Playgroud) go ×8
generics ×4
comparable ×2
any ×1
bash ×1
build ×1
database ×1
ecmascript-6 ×1
es6-modules ×1
filesystems ×1
go-build ×1
go-gin ×1
goroutine ×1
javascript ×1
linux ×1
mount ×1
plpgsql ×1
postgresql ×1
slice ×1
sql ×1
typescript ×1
waitgroup ×1