gpt4 book ai didi

go - 抽象数据类型构造函数会被意外绕过吗?

转载 作者:IT王子 更新时间:2023-10-29 01:36:54 25 4
gpt4 key购买 nike

我正在尝试创建一个表示正数的抽象数据类型:

package m

type positiveNum int

func MakePositiveNum(i int) positiveNum {
if i < 1 { panic("non positive number") }
return positiveNum(i)
}

// some function that expects a positive number
func UsePositiveNum(s positiveNum) {}

以下是一些使用示例:

package main
import "m"
func main() {
pn := m.MakePositiveNum(123)
//i := 1; m.UsePositiveNum(i) // fails as expected because
// int is passed instead of positiveNum
//useInt(pn) // fails because trying to pass positiveNum instead of int
//pn = m.positiveNum(0) // fails as expected because the type is private
m.UsePositiveNum(pn)
}

func UseInt(int) {}

如果将 m.UsePositiveNum(pn) 替换为 m.UsePositiveNum(0),它仍然可以编译,绕过正数类型检查。为什么?

最佳答案

这里发生的事情是 0 是一个 untyped constant .这些常数包含在 this rule about assignability 中。 :

A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:

  • ...
  • x is an untyped constant representable by a value of type T.

由于 positiveNum 的底层类型是 int,可以表示 0,因此转换不会出错。

@peterSO 的回答提供了一种避免这种隐式转换的方法,因为没有从整数常量到结构的隐式转换。请注意,它无法防止恶意用户创建类似 positive.Positive{0} 的值,但这通常不是问题。

关于go - 抽象数据类型构造函数会被意外绕过吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25598863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com